Browse Source
Co-authored-by: Vlad <vlad960706@gmail.com> Reviewed-on: #1 Co-authored-by: Vlad Narizhnyi <vlad960706@gmail.com> Co-committed-by: Vlad Narizhnyi <vlad960706@gmail.com>pull/2/head
2373 changed files with 11506 additions and 415428 deletions
@ -1,17 +1,24 @@
@@ -1,17 +1,24 @@
|
||||
package com.truth; |
||||
|
||||
import android.os.Bundle; |
||||
import org.devio.rn.splashscreen.SplashScreen; |
||||
import com.facebook.react.ReactActivity; |
||||
import com.facebook.react.ReactActivityDelegate; |
||||
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; |
||||
import com.facebook.react.defaults.DefaultReactActivityDelegate; |
||||
import org.devio.rn.splashscreen.SplashScreen; |
||||
|
||||
public class MainActivity extends ReactActivity { |
||||
@Override |
||||
protected void onCreate(Bundle savedInstanceState) { |
||||
SplashScreen.show(this); |
||||
super.onCreate(null); |
||||
} |
||||
|
||||
@Override |
||||
@Override |
||||
protected String getMainComponentName() { |
||||
return "Truth"; |
||||
} |
||||
|
||||
@Override |
||||
protected ReactActivityDelegate createReactActivityDelegate() { |
||||
return new DefaultReactActivityDelegate( |
||||
this, |
||||
getMainComponentName(), |
||||
// If you opted-in for the New Architecture, we enable the Fabric Renderer.
|
||||
DefaultNewArchitectureEntryPoint.getFabricEnabled()); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
/** |
||||
* Copyright (c) Meta Platforms, Inc. and affiliates. |
||||
* |
||||
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root |
||||
* directory of this source tree. |
||||
*/ |
||||
package com.awesomeproject; |
||||
|
||||
import android.content.Context; |
||||
import com.facebook.react.ReactInstanceManager; |
||||
|
||||
/** |
||||
* Class responsible of loading Flipper inside your React Native application. This is the release |
||||
* flavor of it so it's empty as we don't want to load Flipper. |
||||
*/ |
||||
public class ReactNativeFlipper { |
||||
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { |
||||
// Do nothing as we don't want to initialize Flipper on Release.
|
||||
} |
||||
} |
@ -1,5 +1,6 @@
@@ -1,5 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME |
||||
distributionPath=wrapper/dists |
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip |
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip |
||||
networkTimeout=10000 |
||||
zipStoreBase=GRADLE_USER_HOME |
||||
zipStorePath=wrapper/dists |
||||
|
@ -1,9 +1,4 @@
@@ -1,9 +1,4 @@
|
||||
rootProject.name = 'Truth' |
||||
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) |
||||
include ':app' |
||||
include ':react-native-splash-screen' |
||||
project(':react-native-splash-screen').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-splash-screen/android') |
||||
include ':react-native-svg' |
||||
project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android') |
||||
include ':react-native-vector-icons' |
||||
project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') |
||||
includeBuild('../node_modules/@react-native/gradle-plugin') |
||||
|
@ -0,0 +1 @@
@@ -0,0 +1 @@
|
||||
export NODE_BINARY=$(command -v node) |
File diff suppressed because one or more lines are too long
@ -1,8 +1,8 @@
@@ -1,8 +1,8 @@
|
||||
export const buttonsTranslation = { |
||||
skip: 'Skip', |
||||
priceButton: 'Open now / $4.99', |
||||
later: 'Later', |
||||
truth: '-TRUTH-', |
||||
random: 'RANDOM CHANCE', |
||||
dare: '-DARE-', |
||||
} |
||||
skip: 'Skip', |
||||
priceButton: 'Open now / $4.99', |
||||
later: 'Later', |
||||
truth: '-TRUTH-', |
||||
random: 'RANDOM CHANCE', |
||||
dare: '-DARE-', |
||||
}; |
||||
|
@ -1,36 +1,60 @@
@@ -1,36 +1,60 @@
|
||||
import React, {FC, useEffect} from 'react'; |
||||
import React, {FC} from 'react'; |
||||
import { |
||||
colors, |
||||
defaultPackages, |
||||
Header, |
||||
IRouteParams, |
||||
RouteKey, |
||||
ScreenLayout, |
||||
useNav, |
||||
} from '../../shared'; |
||||
import {PackagesList} from '../../package'; |
||||
import { ScrollView } from 'react-native-gesture-handler'; |
||||
interface IProps extends IRouteParams {} |
||||
import {ScrollView} from 'react-native-gesture-handler'; |
||||
import {StyleSheet, View} from 'react-native'; |
||||
import {CustomPackage} from '../../package/atoms/create-custom-package.atom'; |
||||
import {PackagesPageSeparator} from '../../package/atoms/packages-page-separator.atom'; |
||||
import {PackagesItem} from '../../package/components/packages-item.component'; |
||||
import {useTranslation} from 'react-i18next'; |
||||
|
||||
export const SelectPackages: FC<IProps> = ({navigation}) => { |
||||
export const SelectPackages: FC = () => { |
||||
const nav = useNav(); |
||||
const {i18n} = useTranslation(); |
||||
const lang = i18n.language; |
||||
|
||||
return ( |
||||
<ScreenLayout |
||||
backgroundColor={colors.primaryColor} |
||||
backgroundColor={colors.primaryColor} |
||||
backgroundStatusBar={colors.primaryColor} |
||||
headerComponent={ |
||||
<Header |
||||
leftIcon="settings" |
||||
rightIcon="setting" |
||||
onPressRight={() => |
||||
navigation.navigate(RouteKey.Setting, { |
||||
previous_screen: RouteKey.Game, |
||||
title: RouteKey.Setting, |
||||
}) |
||||
} |
||||
/> |
||||
rightIcon="setting" |
||||
onPressRight={() => nav.navigate(RouteKey.Setting)} |
||||
/> |
||||
}> |
||||
<ScrollView contentContainerStyle={{paddingBottom: 30, paddingHorizontal: 5}}> |
||||
<PackagesList /> |
||||
<ScrollView contentContainerStyle={styles.scrollView}> |
||||
<View style={styles.container}> |
||||
{defaultPackages.map((item: any, index) => ( |
||||
<PackagesItem |
||||
title={item.title[lang]} |
||||
description={item.description[lang]} |
||||
questions={item.questions} |
||||
actions={item.actions} |
||||
image={item.image} |
||||
key={index} |
||||
/> |
||||
))} |
||||
<PackagesPageSeparator /> |
||||
<CustomPackage /> |
||||
</View> |
||||
</ScrollView> |
||||
</ScreenLayout> |
||||
); |
||||
}; |
||||
|
||||
const styles = StyleSheet.create({ |
||||
container: { |
||||
flex: 1, |
||||
}, |
||||
scrollView: { |
||||
paddingBottom: 30, |
||||
paddingHorizontal: 5, |
||||
}, |
||||
}); |
||||
|
@ -1,34 +0,0 @@
@@ -1,34 +0,0 @@
|
||||
import React from 'react'; |
||||
import {StyleSheet, View} from 'react-native'; |
||||
import {PackagesPageSeparator} from '../atoms/packages-page-separator.atom'; |
||||
import {PackagesItem} from './packages-item.component'; |
||||
import {CustomPackage} from '../atoms/create-custom-package.atom'; |
||||
import {defaultPackages} from '../../shared/config'; |
||||
import {useTranslation} from 'react-i18next'; |
||||
export const PackagesList = () => { |
||||
const {i18n} = useTranslation(); |
||||
const lang = i18n.language; |
||||
console.log(lang); |
||||
return ( |
||||
<View style={styles.container}> |
||||
{defaultPackages.map((item: any, index) => ( |
||||
<PackagesItem |
||||
title={item.title[lang]} |
||||
description={item.description[lang]} |
||||
questions={item.questions} |
||||
actions={item.actions} |
||||
image={item.image} |
||||
key={index} |
||||
/> |
||||
))} |
||||
<PackagesPageSeparator /> |
||||
<CustomPackage /> |
||||
</View> |
||||
); |
||||
}; |
||||
|
||||
const styles = StyleSheet.create({ |
||||
container: { |
||||
flex: 1, |
||||
}, |
||||
}); |
@ -0,0 +1 @@
@@ -0,0 +1 @@
|
||||
export * from './use-nav.hook'; |
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
import {useNavigation as useNavigationNative} from '@react-navigation/native'; |
||||
|
||||
type UseNavigation = () => { |
||||
navigate: (key: string, params?: Record<any, any>) => void; |
||||
push: (key: string, params?: Record<any, any>) => void; |
||||
goBack: () => void; |
||||
reset: any; |
||||
dispatch: any; |
||||
}; |
||||
|
||||
export const useNav = useNavigationNative as UseNavigation; |
@ -1,7 +1,7 @@
@@ -1,7 +1,7 @@
|
||||
export * from './atoms'; |
||||
export * from './colors'; |
||||
export * from './components'; |
||||
export * from './config'; |
||||
export * from './enums'; |
||||
export * from './helpers'; |
||||
export * from './interfaces'; |
||||
export * from './hooks'; |
||||
|
@ -1,27 +0,0 @@
@@ -1,27 +0,0 @@
|
||||
#!/usr/bin/env ruby_executable_hooks |
||||
# |
||||
# This file was generated by RubyGems. |
||||
# |
||||
# The application 'fuzzy_match' is installed as part of a gem, and |
||||
# this file is here to facilitate running it. |
||||
# |
||||
|
||||
require 'rubygems' |
||||
|
||||
version = ">= 0.a" |
||||
|
||||
str = ARGV.first |
||||
if str |
||||
str = str.b[/\A_(.*)_\z/, 1] |
||||
if str and Gem::Version.correct?(str) |
||||
version = str |
||||
ARGV.shift |
||||
end |
||||
end |
||||
|
||||
if Gem.respond_to?(:activate_bin_path) |
||||
load Gem.activate_bin_path('fuzzy_match', 'fuzzy_match', version) |
||||
else |
||||
gem "fuzzy_match", version |
||||
load Gem.bin_path("fuzzy_match", "fuzzy_match", version) |
||||
end |
@ -1,27 +0,0 @@
@@ -1,27 +0,0 @@
|
||||
#!/usr/bin/env ruby_executable_hooks |
||||
# |
||||
# This file was generated by RubyGems. |
||||
# |
||||
# The application 'httpclient' is installed as part of a gem, and |
||||
# this file is here to facilitate running it. |
||||
# |
||||
|
||||
require 'rubygems' |
||||
|
||||
version = ">= 0.a" |
||||
|
||||
str = ARGV.first |
||||
if str |
||||
str = str.b[/\A_(.*)_\z/, 1] |
||||
if str and Gem::Version.correct?(str) |
||||
version = str |
||||
ARGV.shift |
||||
end |
||||
end |
||||
|
||||
if Gem.respond_to?(:activate_bin_path) |
||||
load Gem.activate_bin_path('httpclient', 'httpclient', version) |
||||
else |
||||
gem "httpclient", version |
||||
load Gem.bin_path("httpclient", "httpclient", version) |
||||
end |
@ -1,27 +0,0 @@
@@ -1,27 +0,0 @@
|
||||
#!/usr/bin/env ruby_executable_hooks |
||||
# |
||||
# This file was generated by RubyGems. |
||||
# |
||||
# The application 'cocoapods' is installed as part of a gem, and |
||||
# this file is here to facilitate running it. |
||||
# |
||||
|
||||
require 'rubygems' |
||||
|
||||
version = ">= 0.a" |
||||
|
||||
str = ARGV.first |
||||
if str |
||||
str = str.b[/\A_(.*)_\z/, 1] |
||||
if str and Gem::Version.correct?(str) |
||||
version = str |
||||
ARGV.shift |
||||
end |
||||
end |
||||
|
||||
if Gem.respond_to?(:activate_bin_path) |
||||
load Gem.activate_bin_path('cocoapods', 'pod', version) |
||||
else |
||||
gem "cocoapods", version |
||||
load Gem.bin_path("cocoapods", "pod", version) |
||||
end |
@ -1,23 +0,0 @@
@@ -1,23 +0,0 @@
|
||||
#!/usr/bin/env ruby |
||||
|
||||
title = "ruby #{ARGV*" "}" |
||||
$0 = ARGV.shift |
||||
Process.setproctitle(title) if Process.methods.include?(:setproctitle) |
||||
|
||||
require 'rubygems' |
||||
begin |
||||
require 'executable-hooks/hooks' |
||||
Gem::ExecutableHooks.run($0) |
||||
rescue LoadError |
||||
warn "unable to load executable-hooks/hooks" if ENV.key?('ExecutableHooks_DEBUG') |
||||
end unless $0.end_with?('/executable-hooks-uninstaller') |
||||
|
||||
content = File.read($0) |
||||
|
||||
if (index = content.index("\n#!ruby\n")) && index > 0 |
||||
skipped_content = content.slice!(0..index) |
||||
start_line = skipped_content.count("\n") + 1 |
||||
eval content, binding, $0, start_line |
||||
else |
||||
eval content, binding, $0 |
||||
end |
@ -1,27 +0,0 @@
@@ -1,27 +0,0 @@
|
||||
#!/usr/bin/env ruby_executable_hooks |
||||
# |
||||
# This file was generated by RubyGems. |
||||
# |
||||
# The application 'cocoapods' is installed as part of a gem, and |
||||
# this file is here to facilitate running it. |
||||
# |
||||
|
||||
require 'rubygems' |
||||
|
||||
version = ">= 0.a" |
||||
|
||||
str = ARGV.first |
||||
if str |
||||
str = str.b[/\A_(.*)_\z/, 1] |
||||
if str and Gem::Version.correct?(str) |
||||
version = str |
||||
ARGV.shift |
||||
end |
||||
end |
||||
|
||||
if Gem.respond_to?(:activate_bin_path) |
||||
load Gem.activate_bin_path('cocoapods', 'sandbox-pod', version) |
||||
else |
||||
gem "cocoapods", version |
||||
load Gem.bin_path("cocoapods", "sandbox-pod", version) |
||||
end |
@ -1,27 +0,0 @@
@@ -1,27 +0,0 @@
|
||||
#!/usr/bin/env ruby_executable_hooks |
||||
# |
||||
# This file was generated by RubyGems. |
||||
# |
||||
# The application 'xcodeproj' is installed as part of a gem, and |
||||
# this file is here to facilitate running it. |
||||
# |
||||
|
||||
require 'rubygems' |
||||
|
||||
version = ">= 0.a" |
||||
|
||||
str = ARGV.first |
||||
if str |
||||
str = str.b[/\A_(.*)_\z/, 1] |
||||
if str and Gem::Version.correct?(str) |
||||
version = str |
||||
ARGV.shift |
||||
end |
||||
end |
||||
|
||||
if Gem.respond_to?(:activate_bin_path) |
||||
load Gem.activate_bin_path('xcodeproj', 'xcodeproj', version) |
||||
else |
||||
gem "xcodeproj", version |
||||
load Gem.bin_path("xcodeproj", "xcodeproj", version) |
||||
end |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -1,229 +0,0 @@
@@ -1,229 +0,0 @@
|
||||
"pkg-config --exists libffi" |
||||
| pkg-config --libs libffi |
||||
=> "-lffi\n" |
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lruby.2.7 " |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: int main(int argc, char **argv) |
||||
4: { |
||||
5: return !!argv[argc]; |
||||
6: } |
||||
/* end */ |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lruby.2.7 -lffi " |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: int main(int argc, char **argv) |
||||
4: { |
||||
5: return !!argv[argc]; |
||||
6: } |
||||
/* end */ |
||||
|
||||
| pkg-config --cflags-only-I libffi |
||||
=> "-I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi\n" |
||||
| pkg-config --cflags-only-other libffi |
||||
=> "\n" |
||||
| pkg-config --libs-only-l libffi |
||||
=> "-lffi\n" |
||||
package configuration for libffi |
||||
incflags: -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi |
||||
cflags: |
||||
ldflags: |
||||
libs: -lffi |
||||
|
||||
have_library: checking for ffi_prep_closure_loc() in -lffi... -------------------- yes |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lffi -lruby.2.7 -lffi -lffi " |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: #include <ffi.h> |
||||
4: |
||||
5: /*top*/ |
||||
6: extern int t(void); |
||||
7: int main(int argc, char **argv) |
||||
8: { |
||||
9: if (argc > 1000000) { |
||||
10: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
11: printf("%d", (*tp)()); |
||||
12: } |
||||
13: |
||||
14: return !!argv[argc]; |
||||
15: } |
||||
16: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_closure_loc; return !p; } |
||||
/* end */ |
||||
|
||||
-------------------- |
||||
|
||||
have_func: checking for ffi_prep_cif_var()... -------------------- yes |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lffi -lffi -lruby.2.7 -lffi -lffi " |
||||
conftest.c:14:57: error: use of undeclared identifier 'ffi_prep_cif_var' |
||||
int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; } |
||||
^ |
||||
1 error generated. |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: /*top*/ |
||||
4: extern int t(void); |
||||
5: int main(int argc, char **argv) |
||||
6: { |
||||
7: if (argc > 1000000) { |
||||
8: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
9: printf("%d", (*tp)()); |
||||
10: } |
||||
11: |
||||
12: return !!argv[argc]; |
||||
13: } |
||||
14: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_cif_var; return !p; } |
||||
/* end */ |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lffi -lffi -lruby.2.7 -lffi -lffi " |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: /*top*/ |
||||
4: extern int t(void); |
||||
5: int main(int argc, char **argv) |
||||
6: { |
||||
7: if (argc > 1000000) { |
||||
8: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
9: printf("%d", (*tp)()); |
||||
10: } |
||||
11: |
||||
12: return !!argv[argc]; |
||||
13: } |
||||
14: extern void ffi_prep_cif_var(); |
||||
15: int t(void) { ffi_prep_cif_var(); return 0; } |
||||
/* end */ |
||||
|
||||
-------------------- |
||||
|
||||
have_func: checking for ffi_raw_call()... -------------------- yes |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lffi -lffi -lruby.2.7 -lffi -lffi " |
||||
conftest.c:14:57: error: use of undeclared identifier 'ffi_raw_call' |
||||
int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_raw_call; return !p; } |
||||
^ |
||||
1 error generated. |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: /*top*/ |
||||
4: extern int t(void); |
||||
5: int main(int argc, char **argv) |
||||
6: { |
||||
7: if (argc > 1000000) { |
||||
8: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
9: printf("%d", (*tp)()); |
||||
10: } |
||||
11: |
||||
12: return !!argv[argc]; |
||||
13: } |
||||
14: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_raw_call; return !p; } |
||||
/* end */ |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lffi -lffi -lruby.2.7 -lffi -lffi " |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: /*top*/ |
||||
4: extern int t(void); |
||||
5: int main(int argc, char **argv) |
||||
6: { |
||||
7: if (argc > 1000000) { |
||||
8: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
9: printf("%d", (*tp)()); |
||||
10: } |
||||
11: |
||||
12: return !!argv[argc]; |
||||
13: } |
||||
14: extern void ffi_raw_call(); |
||||
15: int t(void) { ffi_raw_call(); return 0; } |
||||
/* end */ |
||||
|
||||
-------------------- |
||||
|
||||
have_func: checking for ffi_prep_raw_closure()... -------------------- yes |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lffi -lffi -lruby.2.7 -lffi -lffi " |
||||
conftest.c:14:57: error: use of undeclared identifier 'ffi_prep_raw_closure' |
||||
int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_raw_closure; return !p; } |
||||
^ |
||||
1 error generated. |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: /*top*/ |
||||
4: extern int t(void); |
||||
5: int main(int argc, char **argv) |
||||
6: { |
||||
7: if (argc > 1000000) { |
||||
8: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
9: printf("%d", (*tp)()); |
||||
10: } |
||||
11: |
||||
12: return !!argv[argc]; |
||||
13: } |
||||
14: int t(void) { void ((*volatile p)()); p = (void ((*)()))ffi_prep_raw_closure; return !p; } |
||||
/* end */ |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lffi -lffi -lruby.2.7 -lffi -lffi " |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: /*top*/ |
||||
4: extern int t(void); |
||||
5: int main(int argc, char **argv) |
||||
6: { |
||||
7: if (argc > 1000000) { |
||||
8: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
9: printf("%d", (*tp)()); |
||||
10: } |
||||
11: |
||||
12: return !!argv[argc]; |
||||
13: } |
||||
14: extern void ffi_prep_raw_closure(); |
||||
15: int t(void) { ffi_prep_raw_closure(); return 0; } |
||||
/* end */ |
||||
|
||||
-------------------- |
||||
|
||||
block in append_ldflags: checking for whether -pthread is accepted as LDFLAGS... -------------------- yes |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk/usr/include/ffi -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lffi -lffi -lruby.2.7 -pthread " |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: int main(int argc, char **argv) |
||||
4: { |
||||
5: return !!argv[argc]; |
||||
6: } |
||||
/* end */ |
||||
|
||||
-------------------- |
||||
|
||||
extconf.h is: |
||||
/* begin */ |
||||
1: #ifndef EXTCONF_H |
||||
2: #define EXTCONF_H |
||||
3: #define HAVE_FFI_PREP_CIF_VAR 1 |
||||
4: #define HAVE_FFI_RAW_CALL 1 |
||||
5: #define HAVE_FFI_PREP_RAW_CLOSURE 1 |
||||
6: #define HAVE_RAW_API 1 |
||||
7: #endif |
||||
/* end */ |
||||
|
@ -1,13 +0,0 @@
@@ -1,13 +0,0 @@
|
||||
current directory: /Users/mac/work/truthordare/vendor/bundle/ruby/2.7.0/gems/json-2.6.1/ext/json |
||||
/Users/mac/.rvm/rubies/ruby-2.7.4/bin/ruby -I /Users/mac/.rvm/rubies/ruby-2.7.4/lib/ruby/2.7.0 -r ./siteconf20230203-22685-1uqct8.rb extconf.rb |
||||
creating Makefile |
||||
|
||||
current directory: /Users/mac/work/truthordare/vendor/bundle/ruby/2.7.0/gems/json-2.6.1/ext/json |
||||
make "DESTDIR=" clean |
||||
|
||||
current directory: /Users/mac/work/truthordare/vendor/bundle/ruby/2.7.0/gems/json-2.6.1/ext/json |
||||
make "DESTDIR=" |
||||
make: Nothing to be done for `all'. |
||||
|
||||
current directory: /Users/mac/work/truthordare/vendor/bundle/ruby/2.7.0/gems/json-2.6.1/ext/json |
||||
make "DESTDIR=" install |
Binary file not shown.
Binary file not shown.
@ -1,118 +0,0 @@
@@ -1,118 +0,0 @@
|
||||
have_func: checking for rb_enc_raise() in ruby.h... -------------------- yes |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lruby.2.7 " |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: int main(int argc, char **argv) |
||||
4: { |
||||
5: return !!argv[argc]; |
||||
6: } |
||||
/* end */ |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lruby.2.7 " |
||||
conftest.c:16:57: error: use of undeclared identifier 'rb_enc_raise' |
||||
int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_enc_raise; return !p; } |
||||
^ |
||||
1 error generated. |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: #include <ruby.h> |
||||
4: |
||||
5: /*top*/ |
||||
6: extern int t(void); |
||||
7: int main(int argc, char **argv) |
||||
8: { |
||||
9: if (argc > 1000000) { |
||||
10: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
11: printf("%d", (*tp)()); |
||||
12: } |
||||
13: |
||||
14: return !!argv[argc]; |
||||
15: } |
||||
16: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_enc_raise; return !p; } |
||||
/* end */ |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lruby.2.7 " |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: #include <ruby.h> |
||||
4: |
||||
5: /*top*/ |
||||
6: extern int t(void); |
||||
7: int main(int argc, char **argv) |
||||
8: { |
||||
9: if (argc > 1000000) { |
||||
10: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
11: printf("%d", (*tp)()); |
||||
12: } |
||||
13: |
||||
14: return !!argv[argc]; |
||||
15: } |
||||
16: extern void rb_enc_raise(); |
||||
17: int t(void) { rb_enc_raise(); return 0; } |
||||
/* end */ |
||||
|
||||
-------------------- |
||||
|
||||
have_func: checking for rb_enc_interned_str() in ruby.h... -------------------- no |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lruby.2.7 " |
||||
conftest.c:16:57: error: use of undeclared identifier 'rb_enc_interned_str' |
||||
int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_enc_interned_str; return !p; } |
||||
^ |
||||
1 error generated. |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: #include <ruby.h> |
||||
4: |
||||
5: /*top*/ |
||||
6: extern int t(void); |
||||
7: int main(int argc, char **argv) |
||||
8: { |
||||
9: if (argc > 1000000) { |
||||
10: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
11: printf("%d", (*tp)()); |
||||
12: } |
||||
13: |
||||
14: return !!argv[argc]; |
||||
15: } |
||||
16: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_enc_interned_str; return !p; } |
||||
/* end */ |
||||
|
||||
"gcc -o conftest -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/x86_64-darwin21 -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/backward -I/Users/mac/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0 -I. -I/usr/local/opt/libyaml/include -I/usr/local/opt/libksba/include -I/usr/local/opt/readline/include -I/usr/local/opt/zlib/include -I/usr/local/opt/openssl@1.1/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -g -O2 -fno-common -pipe conftest.c -L. -L/Users/mac/.rvm/rubies/ruby-2.7.4/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -L. -fstack-protector-strong -L/usr/local/lib -L/usr/local/opt/libyaml/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/zlib/lib -L/usr/local/opt/openssl@1.1/lib -lruby.2.7 " |
||||
Undefined symbols for architecture x86_64: |
||||
"_rb_enc_interned_str", referenced from: |
||||
_t in conftest-26355a.o |
||||
ld: symbol(s) not found for architecture x86_64 |
||||
clang: error: linker command failed with exit code 1 (use -v to see invocation) |
||||
checked program was: |
||||
/* begin */ |
||||
1: #include "ruby.h" |
||||
2: |
||||
3: #include <ruby.h> |
||||
4: |
||||
5: /*top*/ |
||||
6: extern int t(void); |
||||
7: int main(int argc, char **argv) |
||||
8: { |
||||
9: if (argc > 1000000) { |
||||
10: int (* volatile tp)(void)=(int (*)(void))&t; |
||||
11: printf("%d", (*tp)()); |
||||
12: } |
||||
13: |
||||
14: return !!argv[argc]; |
||||
15: } |
||||
16: extern void rb_enc_interned_str(); |
||||
17: int t(void) { rb_enc_interned_str(); return 0; } |
||||
/* end */ |
||||
|
||||
-------------------- |
||||
|
@ -1,19 +0,0 @@
@@ -1,19 +0,0 @@
|
||||
Copyright (c) 2010 Christian Kruse, <cjk@wwwtech.de> |
||||
|
||||
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 furnished 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, FITNESS 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. |
||||
|
@ -1,79 +0,0 @@
@@ -1,79 +0,0 @@
|
||||
CFPropertyList implementation |
||||
class to read, manipulate and write both XML and binary property list |
||||
files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List |
||||
for more documentation. |
||||
|
||||
# Caution! |
||||
|
||||
In version 3.0.0 we dropped Ruby 1.8 compatibility. If you are using |
||||
Ruby 1.8 consider to update Ruby; if you can't upgrade, don't upgrade |
||||
CFPropertyList. |
||||
|
||||
# Installation |
||||
|
||||
You could either use ruby gems and install it via |
||||
|
||||
```bash |
||||
gem install CFPropertyList |
||||
``` |
||||
|
||||
or you could clone this repository and place it somewhere in your load path. |
||||
|
||||
Example: |
||||
```ruby |
||||
require 'cfpropertylist' |
||||
``` |
||||
|
||||
If you're using Rails, you can add it into your Gemfile |
||||
|
||||
```ruby |
||||
gem 'CFPropertyList' |
||||
``` |
||||
|
||||
# Usage |
||||
|
||||
## create a arbitrary data structure of basic data types |
||||
|
||||
```ruby |
||||
data = { |
||||
'name' => 'John Doe', |
||||
'missing' => true, |
||||
'last_seen' => Time.now, |
||||
'friends' => ['Jane Doe','Julian Doe'], |
||||
'likes' => { |
||||
'me' => false |
||||
} |
||||
} |
||||
``` |
||||
|
||||
## create CFPropertyList::List object |
||||
|
||||
```ruby |
||||
plist = CFPropertyList::List.new |
||||
``` |
||||
|
||||
## call CFPropertyList.guess() to create corresponding CFType values |
||||
|
||||
```ruby |
||||
plist.value = CFPropertyList.guess(data) |
||||
``` |
||||
|
||||
## write plist to file |
||||
```ruby |
||||
plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY) |
||||
``` |
||||
|
||||
## … later, read it again |
||||
```ruby |
||||
plist = CFPropertyList::List.new(:file => "example.plist") |
||||
data = CFPropertyList.native_types(plist.value) |
||||
``` |
||||
|
||||
# Author and license |
||||
|
||||
**Author:** Christian Kruse (mailto:cjk@wwwtech.de) |
||||
|
||||
**Copyright:** Copyright (c) 2010 |
||||
|
||||
**License:** MIT License |
||||
|
@ -1,43 +0,0 @@
@@ -1,43 +0,0 @@
|
||||
CFPropertyList implementation |
||||
class to read, manipulate and write both XML and binary property list |
||||
files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List |
||||
for more documentation. |
||||
|
||||
== Installation |
||||
|
||||
You could either use ruby gems and install it via |
||||
|
||||
gem install CFPropertyList |
||||
|
||||
or you could clone this repository and place it somewhere in your load path. |
||||
|
||||
== Example |
||||
require 'cfpropertylist' |
||||
|
||||
# create a arbitrary data structure of basic data types |
||||
data = { |
||||
'name' => 'John Doe', |
||||
'missing' => true, |
||||
'last_seen' => Time.now, |
||||
'friends' => ['Jane Doe','Julian Doe'], |
||||
'likes' => { |
||||
'me' => false |
||||
} |
||||
} |
||||
|
||||
# create CFPropertyList::List object |
||||
plist = CFPropertyList::List.new |
||||
|
||||
# call CFPropertyList.guess() to create corresponding CFType values |
||||
plist.value = CFPropertyList.guess(data) |
||||
|
||||
# write plist to file |
||||
plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY) |
||||
|
||||
# … later, read it again |
||||
plist = CFPropertyList::List.new(:file => "example.plist") |
||||
data = CFPropertyList.native_types(plist.value) |
||||
|
||||
Author:: Christian Kruse (mailto:cjk@wwwtech.de) |
||||
Copyright:: Copyright (c) 2010 |
||||
License:: MIT License |
@ -1,7 +0,0 @@
@@ -1,7 +0,0 @@
|
||||
Special thanks to: |
||||
|
||||
Steve Madsen for providing a lot of performance patches and bugfixes! |
||||
Have a look at his Github account: <http://github.com/sjmadsen> |
||||
|
||||
|
||||
|
@ -1,6 +0,0 @@
@@ -1,6 +0,0 @@
|
||||
# -*- coding: utf-8 -*- |
||||
|
||||
require 'cfpropertylist/rbCFPropertyList' |
||||
|
||||
|
||||
# eof |
@ -1,594 +0,0 @@
@@ -1,594 +0,0 @@
|
||||
# -*- coding: utf-8 -*- |
||||
|
||||
require 'stringio' |
||||
|
||||
module CFPropertyList |
||||
# Binary PList parser class |
||||
class Binary |
||||
# Read a binary plist file |
||||
def load(opts) |
||||
@unique_table = {} |
||||
@count_objects = 0 |
||||
@object_refs = 0 |
||||
|
||||
@written_object_count = 0 |
||||
@object_table = [] |
||||
@object_ref_size = 0 |
||||
|
||||
@offsets = [] |
||||
|
||||
fd = nil |
||||
if(opts.has_key?(:file)) |
||||
fd = File.open(opts[:file],"rb") |
||||
file = opts[:file] |
||||
else |
||||
fd = StringIO.new(opts[:data],"rb") |
||||
file = "<string>" |
||||
end |
||||
|
||||
# first, we read the trailer: 32 byte from the end |
||||
fd.seek(-32,IO::SEEK_END) |
||||
buff = fd.read(32) |
||||
|
||||
offset_size, object_ref_size, number_of_objects, top_object, table_offset = buff.unpack "x6CCx4Nx4Nx4N" |
||||
|
||||
# after that, get the offset table |
||||
fd.seek(table_offset, IO::SEEK_SET) |
||||
coded_offset_table = fd.read(number_of_objects * offset_size) |
||||
raise CFFormatError.new("#{file}: Format error!") unless coded_offset_table.bytesize == number_of_objects * offset_size |
||||
|
||||
@count_objects = number_of_objects |
||||
|
||||
# decode offset table |
||||
if(offset_size != 3) |
||||
formats = ["","C*","n*","","N*"] |
||||
@offsets = coded_offset_table.unpack(formats[offset_size]) |
||||
else |
||||
@offsets = coded_offset_table.unpack("C*").each_slice(3).map { |
||||
|x,y,z| (x << 16) | (y << 8) | z |
||||
} |
||||
end |
||||
|
||||
@object_ref_size = object_ref_size |
||||
val = read_binary_object_at(file,fd,top_object) |
||||
|
||||
fd.close |
||||
val |
||||
end |
||||
|
||||
|
||||
# Convert CFPropertyList to binary format; since we have to count our objects we simply unique CFDictionary and CFArray |
||||
def to_str(opts={}) |
||||
@unique_table = {} |
||||
@count_objects = 0 |
||||
@object_refs = 0 |
||||
|
||||
@written_object_count = 0 |
||||
@object_table = [] |
||||
|
||||
@offsets = [] |
||||
|
||||
binary_str = "bplist00" |
||||
|
||||
@object_refs = count_object_refs(opts[:root]) |
||||
|
||||
opts[:root].to_binary(self) |
||||
|
||||
next_offset = 8 |
||||
offsets = @object_table.map do |object| |
||||
offset = next_offset |
||||
next_offset += object.bytesize |
||||
offset |
||||
end |
||||
binary_str << @object_table.join |
||||
|
||||
table_offset = next_offset |
||||
offset_size = Binary.bytes_needed(table_offset) |
||||
|
||||
if offset_size < 8 |
||||
# Fast path: encode the entire offset array at once. |
||||
binary_str << offsets.pack((%w(C n N N)[offset_size - 1]) + '*') |
||||
else |
||||
# Slow path: host may be little or big endian, must pack each offset |
||||
# separately. |
||||
offsets.each do |offset| |
||||
binary_str << "#{Binary.pack_it_with_size(offset_size,offset)}" |
||||
end |
||||
end |
||||
|
||||
binary_str << [offset_size, object_ref_size(@object_refs)].pack("x6CC") |
||||
binary_str << [@object_table.size].pack("x4N") |
||||
binary_str << [0].pack("x4N") |
||||
binary_str << [table_offset].pack("x4N") |
||||
|
||||
binary_str |
||||
end |
||||
|
||||
def object_ref_size object_refs |
||||
Binary.bytes_needed(object_refs) |
||||
end |
||||
|
||||
# read a „null” type (i.e. null byte, marker byte, bool value) |
||||
def read_binary_null_type(length) |
||||
case length |
||||
when 0 then 0 # null byte |
||||
when 8 then CFBoolean.new(false) |
||||
when 9 then CFBoolean.new(true) |
||||
when 15 then 15 # fill type |
||||
else |
||||
raise CFFormatError.new("unknown null type: #{length}") |
||||
end |
||||
end |
||||
protected :read_binary_null_type |
||||
|
||||
# read a binary int value |
||||
def read_binary_int(fname,fd,length) |
||||
if length > 4 |
||||
raise CFFormatError.new("Integer greater than 16 bytes: #{length}") |
||||
end |
||||
|
||||
nbytes = 1 << length |
||||
|
||||
buff = fd.read(nbytes) |
||||
|
||||
CFInteger.new( |
||||
case length |
||||
when 0 then buff.unpack("C")[0] |
||||
when 1 then buff.unpack("n")[0] |
||||
when 2 then buff.unpack("N")[0] |
||||
# 8 byte integers are always signed |
||||
when 3 then buff.unpack("q>")[0] |
||||
# 16 byte integers are used to represent unsigned 8 byte integers |
||||
# where the unsigned value is stored in the lower 8 bytes and the |
||||
# upper 8 bytes are unused. |
||||
when 4 then buff.unpack("Q>Q>")[1] |
||||
end |
||||
) |
||||
end |
||||
protected :read_binary_int |
||||
|
||||
# read a binary real value |
||||
def read_binary_real(fname,fd,length) |
||||
raise CFFormatError.new("Real greater than 8 bytes: #{length}") if length > 3 |
||||
|
||||
nbytes = 1 << length |
||||
buff = fd.read(nbytes) |
||||
|
||||
CFReal.new( |
||||
case length |
||||
when 0 # 1 byte float? must be an error |
||||
raise CFFormatError.new("got #{length+1} byte float, must be an error!") |
||||
when 1 # 2 byte float? must be an error |
||||
raise CFFormatError.new("got #{length+1} byte float, must be an error!") |
||||
when 2 then |
||||
buff.reverse.unpack("e")[0] |
||||
when 3 then |
||||
buff.reverse.unpack("E")[0] |
||||
else |
||||
fail "unexpected length: #{length}" |
||||
end |
||||
) |
||||
end |
||||
protected :read_binary_real |
||||
|
||||
# read a binary date value |
||||
def read_binary_date(fname,fd,length) |
||||
raise CFFormatError.new("Date greater than 8 bytes: #{length}") if length > 3 |
||||
|
||||
nbytes = 1 << length |
||||
buff = fd.read(nbytes) |
||||
|
||||
CFDate.new( |
||||
case length |
||||
when 0 then # 1 byte CFDate is an error |
||||
raise CFFormatError.new("#{length+1} byte CFDate, error") |
||||
when 1 then # 2 byte CFDate is an error |
||||
raise CFFormatError.new("#{length+1} byte CFDate, error") |
||||
when 2 then |
||||
buff.reverse.unpack("e")[0] |
||||
when 3 then |
||||
buff.reverse.unpack("E")[0] |
||||
end, |
||||
CFDate::TIMESTAMP_APPLE |
||||
) |
||||
end |
||||
protected :read_binary_date |
||||
|
||||
# Read a binary data value |
||||
def read_binary_data(fname,fd,length) |
||||
CFData.new(read_fd(fd, length), CFData::DATA_RAW) |
||||
end |
||||
protected :read_binary_data |
||||
|
||||
def read_fd fd, length |
||||
length > 0 ? fd.read(length) : "" |
||||
end |
||||
|
||||
# Read a binary string value |
||||
def read_binary_string(fname,fd,length) |
||||
buff = read_fd fd, length |
||||
@unique_table[buff] = true unless @unique_table.has_key?(buff) |
||||
CFString.new(buff) |
||||
end |
||||
protected :read_binary_string |
||||
|
||||
# Convert the given string from one charset to another |
||||
def Binary.charset_convert(str,from,to="UTF-8") |
||||
return str.dup.force_encoding(from).encode(to) if str.respond_to?("encode") |
||||
Iconv.conv(to,from,str) |
||||
end |
||||
|
||||
# Count characters considering character set |
||||
def Binary.charset_strlen(str,charset="UTF-8") |
||||
if str.respond_to?(:encode) |
||||
size = str.length |
||||
else |
||||
utf8_str = Iconv.conv("UTF-8",charset,str) |
||||
size = utf8_str.scan(/./mu).size |
||||
end |
||||
|
||||
# UTF-16 code units in the range D800-DBFF are the beginning of |
||||
# a surrogate pair, and count as one additional character for |
||||
# length calculation. |
||||
if charset =~ /^UTF-16/ |
||||
if str.respond_to?(:encode) |
||||
str.bytes.to_a.each_slice(2) { |pair| size += 1 if (0xd8..0xdb).include?(pair[0]) } |
||||
else |
||||
str.split('').each_slice(2) { |pair| size += 1 if ("\xd8".."\xdb").include?(pair[0]) } |
||||
end |
||||
end |
||||
|
||||
size |
||||
end |
||||
|
||||
# Read a unicode string value, coded as UTF-16BE |
||||
def read_binary_unicode_string(fname,fd,length) |
||||
# The problem is: we get the length of the string IN CHARACTERS; |
||||
# since a char in UTF-16 can be 16 or 32 bit long, we don't really know |
||||
# how long the string is in bytes |
||||
buff = fd.read(2*length) |
||||
|
||||
@unique_table[buff] = true unless @unique_table.has_key?(buff) |
||||
CFString.new(Binary.charset_convert(buff,"UTF-16BE","UTF-8")) |
||||
end |
||||
protected :read_binary_unicode_string |
||||
|
||||
def unpack_with_size(nbytes, buff) |
||||
format = ["C*", "n*", "N*", "N*"][nbytes - 1]; |
||||
|
||||
if nbytes == 3 |
||||
buff = "\0" + buff.scan(/.{1,3}/).join("\0") |
||||
end |
||||
|
||||
return buff.unpack(format) |
||||
end |
||||
|
||||
# Read an binary array value, including contained objects |
||||
def read_binary_array(fname,fd,length) |
||||
ary = [] |
||||
|
||||
# first: read object refs |
||||
if(length != 0) |
||||
buff = fd.read(length * @object_ref_size) |
||||
objects = unpack_with_size(@object_ref_size, buff) #buff.unpack(@object_ref_size == 1 ? "C*" : "n*") |
||||
|
||||
# now: read objects |
||||
0.upto(length-1) do |i| |
||||
object = read_binary_object_at(fname,fd,objects[i]) |
||||
ary.push object |
||||
end |
||||
end |
||||
|
||||
CFArray.new(ary) |
||||
end |
||||
protected :read_binary_array |
||||
|
||||
# Read a dictionary value, including contained objects |
||||
def read_binary_dict(fname,fd,length) |
||||
dict = {} |
||||
|
||||
# first: read keys |
||||
if(length != 0) then |
||||
buff = fd.read(length * @object_ref_size) |
||||
keys = unpack_with_size(@object_ref_size, buff) |
||||
|
||||
# second: read object refs |
||||
buff = fd.read(length * @object_ref_size) |
||||
objects = unpack_with_size(@object_ref_size, buff) |
||||
|
||||
# read real keys and objects |
||||
0.upto(length-1) do |i| |
||||
key = read_binary_object_at(fname,fd,keys[i]) |
||||
object = read_binary_object_at(fname,fd,objects[i]) |
||||
dict[key.value] = object |
||||
end |
||||
end |
||||
|
||||
CFDictionary.new(dict) |
||||
end |
||||
protected :read_binary_dict |
||||
|
||||
# Read an object type byte, decode it and delegate to the correct |
||||
# reader function |
||||
def read_binary_object(fname,fd) |
||||
# first: read the marker byte |
||||
buff = fd.read(1) |
||||
|
||||
object_length = buff.unpack("C*") |
||||
object_length = object_length[0] & 0xF |
||||
|
||||
buff = buff.unpack("H*") |
||||
object_type = buff[0][0].chr |
||||
|
||||
if(object_type != "0" && object_length == 15) then |
||||
object_length = read_binary_object(fname,fd) |
||||
object_length = object_length.value |
||||
end |
||||
|
||||
case object_type |
||||
when '0' # null, false, true, fillbyte |
||||
read_binary_null_type(object_length) |
||||
when '1' # integer |
||||
read_binary_int(fname,fd,object_length) |
||||
when '2' # real |
||||
read_binary_real(fname,fd,object_length) |
||||
when '3' # date |
||||
read_binary_date(fname,fd,object_length) |
||||
when '4' # data |
||||
read_binary_data(fname,fd,object_length) |
||||
when '5' # byte string, usually utf8 encoded |
||||
read_binary_string(fname,fd,object_length) |
||||
when '6' # unicode string (utf16be) |
||||
read_binary_unicode_string(fname,fd,object_length) |
||||
when '8' |
||||
CFUid.new(read_binary_int(fname, fd, object_length).value) |
||||
when 'a' # array |
||||
read_binary_array(fname,fd,object_length) |
||||
when 'd' # dictionary |
||||
read_binary_dict(fname,fd,object_length) |
||||
end |
||||
end |
||||
protected :read_binary_object |
||||
|
||||
# Read an object type byte at position $pos, decode it and delegate to the correct reader function |
||||
def read_binary_object_at(fname,fd,pos) |
||||
position = @offsets[pos] |
||||
fd.seek(position,IO::SEEK_SET) |
||||
read_binary_object(fname,fd) |
||||
end |
||||
protected :read_binary_object_at |
||||
|
||||
# pack an +int+ of +nbytes+ with size |
||||
def Binary.pack_it_with_size(nbytes,int) |
||||
case nbytes |
||||
when 1 then [int].pack('c') |
||||
when 2 then [int].pack('n') |
||||
when 4 then [int].pack('N') |
||||
when 8 |
||||
[int >> 32, int & 0xFFFFFFFF].pack('NN') |
||||
else |
||||
raise CFFormatError.new("Don't know how to pack #{nbytes} byte integer") |
||||
end |
||||
end |
||||
|
||||
def Binary.pack_int_array_with_size(nbytes, array) |
||||
case nbytes |
||||
when 1 then array.pack('C*') |
||||
when 2 then array.pack('n*') |
||||
when 4 then array.pack('N*') |
||||
when 8 |
||||
array.map { |int| [int >> 32, int & 0xFFFFFFFF].pack('NN') }.join |
||||
else |
||||
raise CFFormatError.new("Don't know how to pack #{nbytes} byte integer") |
||||
end |
||||
end |
||||
|
||||
# calculate how many bytes are needed to save +count+ |
||||
def Binary.bytes_needed(count) |
||||
case |
||||
when count < 2**8 then 1 |
||||
when count < 2**16 then 2 |
||||
when count < 2**32 then 4 |
||||
when count < 2**64 then 8 |
||||
else |
||||
raise CFFormatError.new("Data size too large: #{count}") |
||||
end |
||||
end |
||||
|
||||
# Create a type byte for binary format as defined by apple |
||||
def Binary.type_bytes(type, length) |
||||
if length < 15 |
||||
[(type << 4) | length].pack('C') |
||||
else |
||||
bytes = [(type << 4) | 0xF] |
||||
if length <= 0xFF |
||||
bytes.push(0x10, length).pack('CCC') # 1 byte length |
||||
elsif length <= 0xFFFF |
||||
bytes.push(0x11, length).pack('CCn') # 2 byte length |
||||
elsif length <= 0xFFFFFFFF |
||||
bytes.push(0x12, length).pack('CCN') # 4 byte length |
||||
elsif length <= 0x7FFFFFFFFFFFFFFF |
||||
bytes.push(0x13, length >> 32, length & 0xFFFFFFFF).pack('CCNN') # 8 byte length |
||||
else |
||||
raise CFFormatError.new("Integer too large: #{int}") |
||||
end |
||||
end |
||||
end |
||||
|
||||
def count_object_refs(object) |
||||
case object |
||||
when CFArray |
||||
contained_refs = 0 |
||||
object.value.each do |element| |
||||
if CFArray === element || CFDictionary === element |
||||
contained_refs += count_object_refs(element) |
||||
end |
||||
end |
||||
return object.value.size + contained_refs |
||||
when CFDictionary |
||||
contained_refs = 0 |
||||
object.value.each_value do |value| |
||||
if CFArray === value || CFDictionary === value |
||||
contained_refs += count_object_refs(value) |
||||
end |
||||
end |
||||
return object.value.keys.size * 2 + contained_refs |
||||
else |
||||
return 0 |
||||
end |
||||
end |
||||
|
||||
def Binary.ascii_string?(str) |
||||
if str.respond_to?(:ascii_only?) |
||||
str.ascii_only? |
||||
else |
||||
str !~ /[\x80-\xFF]/mn |
||||
end |
||||
end |
||||
|
||||
# Uniques and transforms a string value to binary format and adds it to the object table |
||||
def string_to_binary(val) |
||||
val = val.to_s |
||||
|
||||
@unique_table[val] ||= begin |
||||
if !Binary.ascii_string?(val) |
||||
val = Binary.charset_convert(val,"UTF-8","UTF-16BE") |
||||
bdata = Binary.type_bytes(0b0110, Binary.charset_strlen(val,"UTF-16BE")) |
||||
|
||||
val.force_encoding("ASCII-8BIT") if val.respond_to?("encode") |
||||
@object_table[@written_object_count] = bdata << val |
||||
else |
||||
bdata = Binary.type_bytes(0b0101,val.bytesize) |
||||
@object_table[@written_object_count] = bdata << val |
||||
end |
||||
|
||||
@written_object_count += 1 |
||||
@written_object_count - 1 |
||||
end |
||||
end |
||||
|
||||
# Codes an integer to binary format |
||||
def int_to_binary(value) |
||||
# Note: nbytes is actually an exponent. number of bytes = 2**nbytes. |
||||
nbytes = 0 |
||||
nbytes = 1 if value > 0xFF # 1 byte unsigned integer |
||||
nbytes += 1 if value > 0xFFFF # 4 byte unsigned integer |
||||
nbytes += 1 if value > 0xFFFFFFFF # 8 byte unsigned integer |
||||
nbytes += 1 if value > 0x7FFFFFFFFFFFFFFF # 8 byte unsigned integer, stored in lower half of 16 bytes |
||||
nbytes = 3 if value < 0 # signed integers always stored in 8 bytes |
||||
|
||||
Binary.type_bytes(0b0001, nbytes) << |
||||
if nbytes < 4 |
||||
[value].pack(["C", "n", "N", "q>"][nbytes]) |
||||
else # nbytes == 4 |
||||
[0,value].pack("Q>Q>") |
||||
end |
||||
end |
||||
|
||||
# Codes a real value to binary format |
||||
def real_to_binary(val) |
||||
Binary.type_bytes(0b0010,3) << [val].pack("E").reverse |
||||
end |
||||
|
||||
# Converts a numeric value to binary and adds it to the object table |
||||
def num_to_binary(value) |
||||
@object_table[@written_object_count] = |
||||
if value.is_a?(CFInteger) |
||||
int_to_binary(value.value) |
||||
else |
||||
real_to_binary(value.value) |
||||
end |
||||
|
||||
@written_object_count += 1 |
||||
@written_object_count - 1 |
||||
end |
||||
|
||||
def uid_to_binary(value) |
||||
nbytes = 0 |
||||
nbytes = 1 if value > 0xFF # 1 byte integer |
||||
nbytes += 1 if value > 0xFFFF # 4 byte integer |
||||
nbytes += 1 if value > 0xFFFFFFFF # 8 byte integer |
||||
nbytes = 3 if value < 0 # 8 byte integer, since signed |
||||
|
||||
@object_table[@written_object_count] = Binary.type_bytes(0b1000, nbytes) << |
||||
if nbytes < 3 |
||||
[value].pack( |
||||
if nbytes == 0 then "C" |
||||
elsif nbytes == 1 then "n" |
||||
else "N" |
||||
end |
||||
) |
||||
else |
||||
# 64 bit signed integer; we need the higher and the lower 32 bit of the value |
||||
high_word = value >> 32 |
||||
low_word = value & 0xFFFFFFFF |
||||
[high_word,low_word].pack("NN") |
||||
end |
||||
|
||||
@written_object_count += 1 |
||||
@written_object_count - 1 |
||||
end |
||||
|
||||
# Convert date value (apple format) to binary and adds it to the object table |
||||
def date_to_binary(val) |
||||
val = val.getutc.to_f - CFDate::DATE_DIFF_APPLE_UNIX # CFDate is a real, number of seconds since 01/01/2001 00:00:00 GMT |
||||
|
||||
@object_table[@written_object_count] = |
||||
(Binary.type_bytes(0b0011, 3) << [val].pack("E").reverse) |
||||
|
||||
@written_object_count += 1 |
||||
@written_object_count - 1 |
||||
end |
||||
|
||||
# Convert a bool value to binary and add it to the object table |
||||
def bool_to_binary(val) |
||||
|
||||
@object_table[@written_object_count] = val ? "\x9" : "\x8" # 0x9 is 1001, type indicator for true; 0x8 is 1000, type indicator for false |
||||
@written_object_count += 1 |
||||
@written_object_count - 1 |
||||
end |
||||
|
||||
# Convert data value to binary format and add it to the object table |
||||
def data_to_binary(val) |
||||
@object_table[@written_object_count] = |
||||
(Binary.type_bytes(0b0100, val.bytesize) << val) |
||||
|
||||
@written_object_count += 1 |
||||
@written_object_count - 1 |
||||
end |
||||
|
||||
# Convert array to binary format and add it to the object table |
||||
def array_to_binary(val) |
||||
saved_object_count = @written_object_count |
||||
@written_object_count += 1 |
||||
#@object_refs += val.value.size |
||||
|
||||
values = val.value.map { |v| v.to_binary(self) } |
||||
bdata = Binary.type_bytes(0b1010, val.value.size) << |
||||
Binary.pack_int_array_with_size(object_ref_size(@object_refs), |
||||
values) |
||||
|
||||
@object_table[saved_object_count] = bdata |
||||
saved_object_count |
||||
end |
||||
|
||||
# Convert dictionary to binary format and add it to the object table |
||||
def dict_to_binary(val) |
||||
saved_object_count = @written_object_count |
||||
@written_object_count += 1 |
||||
|
||||
#@object_refs += val.value.keys.size * 2 |
||||
|
||||
keys_and_values = val.value.keys.map { |k| CFString.new(k).to_binary(self) } |
||||
keys_and_values.concat(val.value.values.map { |v| v.to_binary(self) }) |
||||
|
||||
bdata = Binary.type_bytes(0b1101,val.value.size) << |
||||
Binary.pack_int_array_with_size(object_ref_size(@object_refs), keys_and_values) |
||||
|
||||
@object_table[saved_object_count] = bdata |
||||
return saved_object_count |
||||
end |
||||
end |
||||
end |
||||
|
||||
# eof |
@ -1,26 +0,0 @@
@@ -1,26 +0,0 @@
|
||||
# -*- coding: utf-8 -*- |
||||
# |
||||
# Exceptions used: |
||||
# CFPlistError:: General base exception |
||||
# CFFormatError:: Format error |
||||
# CFTypeError:: Type error |
||||
# |
||||
# Easy and simple :-) |
||||
# |
||||
# Author:: Christian Kruse (mailto:cjk@wwwtech.de) |
||||
# Copyright:: Copyright (c) 2010 |
||||
# License:: MIT License |
||||
|
||||
# general plist error. All exceptions thrown are derived from this class. |
||||
class CFPlistError < StandardError |
||||
end |
||||
|
||||
# Exception thrown when format errors occur |
||||
class CFFormatError < CFPlistError |
||||
end |
||||
|
||||
# Exception thrown when type errors occur |
||||
class CFTypeError < CFPlistError |
||||
end |
||||
|
||||
# eof |
@ -1,449 +0,0 @@
@@ -1,449 +0,0 @@
|
||||
# -*- coding: utf-8 -*- |
||||
|
||||
require 'kconv' |
||||
require 'date' |
||||
require 'time' |
||||
|
||||
# |
||||
# CFPropertyList implementation |
||||
# |
||||
# class to read, manipulate and write both XML and binary property list |
||||
# files (plist(5)) as defined by Apple. Have a look at CFPropertyList::List |
||||
# for more documentation. |
||||
# |
||||
# == Example |
||||
# require 'cfpropertylist' |
||||
# |
||||
# # create a arbitrary data structure of basic data types |
||||
# data = { |
||||
# 'name' => 'John Doe', |
||||
# 'missing' => true, |
||||
# 'last_seen' => Time.now, |
||||
# 'friends' => ['Jane Doe','Julian Doe'], |
||||
# 'likes' => { |
||||
# 'me' => false |
||||
# } |
||||
# } |
||||
# |
||||
# # create CFPropertyList::List object |
||||
# plist = CFPropertyList::List.new |
||||
# |
||||
# # call CFPropertyList.guess() to create corresponding CFType values |
||||
# # pass in optional :convert_unknown_to_string => true to convert things like symbols into strings. |
||||
# plist.value = CFPropertyList.guess(data) |
||||
# |
||||
# # write plist to file |
||||
# plist.save("example.plist", CFPropertyList::List::FORMAT_BINARY) |
||||
# |
||||
# # … later, read it again |
||||
# plist = CFPropertyList::List.new(:file => "example.plist") |
||||
# data = CFPropertyList.native_types(plist.value) |
||||
# |
||||
# Author:: Christian Kruse (mailto:cjk@wwwtech.de) |
||||
# Copyright:: Copyright (c) 2010 |
||||
# License:: MIT License |
||||
module CFPropertyList |
||||
class << self |
||||
attr_accessor :xml_parser_interface |
||||
end |
||||
|
||||
# interface class for PList parsers |
||||
class ParserInterface |
||||
# load a plist |
||||
def load(opts={}) |
||||
return "" |
||||
end |
||||
|
||||
# convert a plist to string |
||||
def to_str(opts={}) |
||||
return true |
||||
end |
||||
end |
||||
|
||||
class XMLParserInterface < ParserInterface |
||||
def new_node(name) |
||||
end |
||||
|
||||
def new_text(val) |
||||
end |
||||
|
||||
def append_node(parent, child) |
||||
end |
||||
end |
||||
end |
||||
|
||||
dirname = File.dirname(__FILE__) |
||||
require dirname + '/rbCFPlistError.rb' |
||||
require dirname + '/rbCFTypes.rb' |
||||
require dirname + '/rbBinaryCFPropertyList.rb' |
||||
require dirname + '/rbPlainCFPropertyList.rb' |
||||
|
||||
begin |
||||
require dirname + '/rbLibXMLParser.rb' |
||||
temp = LibXML::XML::Parser::Options::NOBLANKS # check if we have a version with parser options |
||||
temp = false # avoid a warning |
||||
try_nokogiri = false |
||||
CFPropertyList.xml_parser_interface = CFPropertyList::LibXMLParser |
||||
rescue LoadError, NameError |
||||
try_nokogiri = true |
||||
end |
||||
|
||||
if try_nokogiri then |
||||
begin |
||||
require dirname + '/rbNokogiriParser.rb' |
||||
CFPropertyList.xml_parser_interface = CFPropertyList::NokogiriXMLParser |
||||
rescue LoadError |
||||
require dirname + '/rbREXMLParser.rb' |
||||
CFPropertyList.xml_parser_interface = CFPropertyList::ReXMLParser |
||||
end |
||||
end |
||||
|
||||
|
||||
module CFPropertyList |
||||
# Create CFType hierarchy by guessing the correct CFType, e.g. |
||||
# |
||||
# x = { |
||||
# 'a' => ['b','c','d'] |
||||
# } |
||||
# cftypes = CFPropertyList.guess(x) |
||||
# |
||||
# pass optional options hash. Only possible value actually: |
||||
# +convert_unknown_to_string+:: Convert unknown objects to string calling to_str() |
||||
# +converter_method+:: Convert unknown objects to known objects calling +method_name+ |
||||
# |
||||
# cftypes = CFPropertyList.guess(x,:convert_unknown_to_string => true,:converter_method => :to_hash, :converter_with_opts => true) |
||||
def guess(object, options = {}) |
||||
case object |
||||
when Integer then CFInteger.new(object) |
||||
when UidFixnum then CFUid.new(object) |
||||
when Float then CFReal.new(object) |
||||
when TrueClass, FalseClass then CFBoolean.new(object) |
||||
|
||||
when Blob |
||||
CFData.new(object, CFData::DATA_RAW) |
||||
|
||||
when String, Symbol |
||||
CFString.new(object.to_s) |
||||
|
||||
when Time, DateTime, Date |
||||
CFDate.new(object) |
||||
|
||||
when Array, Enumerator |
||||
ary = Array.new |
||||
object.each do |o| |
||||
ary.push CFPropertyList.guess(o, options) |
||||
end |
||||
CFArray.new(ary) |
||||
|
||||
when Hash |
||||
hsh = Hash.new |
||||
object.each_pair do |k,v| |
||||
k = k.to_s if k.is_a?(Symbol) |
||||
hsh[k] = CFPropertyList.guess(v, options) |
||||
end |
||||
CFDictionary.new(hsh) |
||||
else |
||||
case |
||||
when Object.const_defined?('BigDecimal') && object.is_a?(BigDecimal) |
||||
CFReal.new(object) |
||||
when object.respond_to?(:read) |
||||
raw_data = object.read |
||||
# treat the data as a bytestring (ASCII-8BIT) if Ruby supports it. Do this by forcing |
||||
# the encoding, on the assumption that the bytes were read correctly, and just tagged with |
||||
# an inappropriate encoding, rather than transcoding. |
||||
raw_data.force_encoding(Encoding::ASCII_8BIT) if raw_data.respond_to?(:force_encoding) |
||||
CFData.new(raw_data, CFData::DATA_RAW) |
||||
when options[:converter_method] && object.respond_to?(options[:converter_method]) |
||||
if options[:converter_with_opts] |
||||
CFPropertyList.guess(object.send(options[:converter_method],options),options) |
||||
else |
||||
CFPropertyList.guess(object.send(options[:converter_method]),options) |
||||
end |
||||
when options[:convert_unknown_to_string] |
||||
CFString.new(object.to_s) |
||||
else |
||||
raise CFTypeError.new("Unknown class #{object.class.to_s}. Try using :convert_unknown_to_string if you want to use unknown object types!") |
||||
end |
||||
end |
||||
end |
||||
|
||||
# Converts a CFType hiercharchy to native Ruby types |
||||
def native_types(object,keys_as_symbols=false) |
||||
return if object.nil? |
||||
|
||||
if(object.is_a?(CFDate) || object.is_a?(CFString) || object.is_a?(CFInteger) || object.is_a?(CFReal) || object.is_a?(CFBoolean)) || object.is_a?(CFUid) then |
||||
return object.value |
||||
elsif(object.is_a?(CFData)) then |
||||
return CFPropertyList::Blob.new(object.decoded_value) |
||||
elsif(object.is_a?(CFArray)) then |
||||
ary = [] |
||||
object.value.each do |
||||
|v| |
||||
ary.push CFPropertyList.native_types(v) |
||||
end |
||||
|
||||
return ary |
||||
elsif(object.is_a?(CFDictionary)) then |
||||
hsh = {} |
||||
object.value.each_pair do |
||||
|k,v| |
||||
k = k.to_sym if keys_as_symbols |
||||
hsh[k] = CFPropertyList.native_types(v) |
||||
end |
||||
|
||||
return hsh |
||||
end |
||||
end |
||||
|
||||
module_function :guess, :native_types |
||||
|
||||
# Class representing a CFPropertyList. Instantiate with #new |
||||
class List |
||||
# Format constant for binary format |
||||
FORMAT_BINARY = 1 |
||||
|
||||
# Format constant for XML format |
||||
FORMAT_XML = 2 |
||||
|
||||
# Format constant for the old plain format |
||||
FORMAT_PLAIN = 3 |
||||
|
||||
# Format constant for automatic format recognizing |
||||
FORMAT_AUTO = 0 |
||||
|
||||
@@parsers = [Binary, CFPropertyList.xml_parser_interface, PlainParser] |
||||
|
||||
# Path of PropertyList |
||||
attr_accessor :filename |
||||
# the original format of the PropertyList |
||||
attr_accessor :format |
||||
# the root value in the plist file |
||||
attr_accessor :value |
||||
# default value for XML generation; if true generate formatted XML |
||||
attr_accessor :formatted |
||||
|
||||
# initialize a new CFPropertyList, arguments are: |
||||
# |
||||
# :file:: Parse a file |
||||
# :format:: Format is one of FORMAT_BINARY or FORMAT_XML. Defaults to FORMAT_AUTO |
||||
# :data:: Parse a string |
||||
# |
||||
# All arguments are optional |
||||
def initialize(opts={}) |
||||
@filename = opts[:file] |
||||
@format = opts[:format] || FORMAT_AUTO |
||||
@data = opts[:data] |
||||
@formatted = opts[:formatted] |
||||
|
||||
load(@filename) unless @filename.nil? |
||||
load_str(@data) unless @data.nil? |
||||
end |
||||
|
||||
# returns a list of registered parsers |
||||
def self.parsers |
||||
@@parsers |
||||
end |
||||
|
||||
# set a list of parsers |
||||
def self.parsers=(val) |
||||
@@parsers = val |
||||
end |
||||
|
||||
# Load an XML PropertyList |
||||
# filename = nil:: The filename to read from; if nil, read from the file defined by instance variable +filename+ |
||||
def load_xml(filename=nil) |
||||
load(filename,List::FORMAT_XML) |
||||
end |
||||
|
||||
# read a binary plist file |
||||
# filename = nil:: The filename to read from; if nil, read from the file defined by instance variable +filename+ |
||||
def load_binary(filename=nil) |
||||
load(filename,List::FORMAT_BINARY) |
||||
end |
||||
|
||||
# read a plain plist file |
||||
# filename = nil:: The filename to read from; if nil, read from the file defined by instance variable +filename+ |
||||
def load_plain(filename=nil) |
||||
load(filename,List::FORMAT_PLAIN) |
||||
end |
||||
|
||||
# load a plist from a XML string |
||||
# str:: The string containing the plist |
||||
def load_xml_str(str=nil) |
||||
load_str(str,List::FORMAT_XML) |
||||
end |
||||
|
||||
# load a plist from a binary string |
||||
# str:: The string containing the plist |
||||
def load_binary_str(str=nil) |
||||
load_str(str,List::FORMAT_BINARY) |
||||
end |
||||
|
||||
# load a plist from a plain string |
||||
# str:: The string containing the plist |
||||
def load_plain_str(str=nil) |
||||
load_str(str,List::FORMAT_PLAIN) |
||||
end |
||||
|
||||
# load a plist from a string |
||||
# str = nil:: The string containing the plist |
||||
# format = nil:: The format of the plist |
||||
def load_str(str=nil,format=nil) |
||||
str = @data if str.nil? |
||||
format = @format if format.nil? |
||||
|
||||
@value = {} |
||||
case format |
||||
when List::FORMAT_BINARY, List::FORMAT_XML, List::FORMAT_PLAIN then |
||||
prsr = @@parsers[format-1].new |
||||
@value = prsr.load({:data => str}) |
||||
|
||||
when List::FORMAT_AUTO then # what we now do is ugly, but neccessary to recognize the file format |
||||
filetype = str[0..5] |
||||
version = str[6..7] |
||||
|
||||
prsr = nil |
||||
|
||||
if filetype == "bplist" then |
||||
raise CFFormatError.new("Wrong file version #{version}") unless version == "00" |
||||
prsr = Binary.new |
||||
@format = List::FORMAT_BINARY |
||||
else |
||||
if str =~ /^<(\?xml|!DOCTYPE|plist)/ |
||||
prsr = CFPropertyList.xml_parser_interface.new |
||||
@format = List::FORMAT_XML |
||||
else |
||||
prsr = PlainParser.new |
||||
@format = List::FORMAT_PLAIN |
||||
end |
||||
end |
||||
|
||||
@value = prsr.load({:data => str}) |
||||
end |
||||
end |
||||
|
||||
# Read a plist file |
||||
# file = nil:: The filename of the file to read. If nil, use +filename+ instance variable |
||||
# format = nil:: The format of the plist file. Auto-detect if nil |
||||
def load(file=nil,format=nil) |
||||
file = @filename if file.nil? |
||||
format = @format if format.nil? |
||||
@value = {} |
||||
|
||||
raise IOError.new("File #{file} not readable!") unless File.readable? file |
||||
|
||||
case format |
||||
when List::FORMAT_BINARY, List::FORMAT_XML, List::FORMAT_PLAIN then |
||||
prsr = @@parsers[format-1].new |
||||
@value = prsr.load({:file => file}) |
||||
|
||||
when List::FORMAT_AUTO then # what we now do is ugly, but neccessary to recognize the file format |
||||
magic_number = IO.read(file,12) |
||||
raise IOError.new("File #{file} is empty.") unless magic_number |
||||
filetype = magic_number[0..5] |
||||
version = magic_number[6..7] |
||||
|
||||
prsr = nil |
||||
if filetype == "bplist" then |
||||
raise CFFormatError.new("Wrong file version #{version}") unless version == "00" |
||||
prsr = Binary.new |
||||
@format = List::FORMAT_BINARY |
||||
else |
||||
if magic_number =~ /^<(\?xml|!DOCTYPE|plist)/ |
||||
prsr = CFPropertyList.xml_parser_interface.new |
||||
@format = List::FORMAT_XML |
||||
else |
||||
prsr = PlainParser.new |
||||
@format = List::FORMAT_PLAIN |
||||
end |
||||
end |
||||
|
||||
@value = prsr.load({:file => file}) |
||||
end |
||||
|
||||
raise CFFormatError.new("Invalid format or parser error!") if @value.nil? |
||||
end |
||||
|
||||
# Serialize CFPropertyList object to specified format and write it to file |
||||
# file = nil:: The filename of the file to write to. Uses +filename+ instance variable if nil |
||||
# format = nil:: The format to save in. Uses +format+ instance variable if nil |
||||
def save(file=nil,format=nil,opts={}) |
||||
format = @format if format.nil? |
||||
file = @filename if file.nil? |
||||
|
||||
if format != FORMAT_BINARY && format != FORMAT_XML && format != FORMAT_PLAIN |
||||
raise CFFormatError.new("Format #{format} not supported, use List::FORMAT_BINARY or List::FORMAT_XML") |
||||
end |
||||
|
||||
if(!File.exists?(file)) then |
||||
raise IOError.new("File #{file} not writable!") unless File.writable?(File.dirname(file)) |
||||
elsif(!File.writable?(file)) then |
||||
raise IOError.new("File #{file} not writable!") |
||||
end |
||||
|
||||
opts[:root] = @value |
||||
opts[:formatted] = @formatted unless opts.has_key?(:formatted) |
||||
|
||||
prsr = @@parsers[format-1].new |
||||
|
||||
content = prsr.to_str(opts) |
||||
|
||||
File.open(file, 'wb') { |
||||
|fd| |
||||
fd.write content |
||||
} |
||||
end |
||||
|
||||
# convert plist to string |
||||
# format = List::FORMAT_BINARY:: The format to save the plist |
||||
# opts={}:: Pass parser options |
||||
def to_str(format=List::FORMAT_BINARY,opts={}) |
||||
if format != FORMAT_BINARY && format != FORMAT_XML && format != FORMAT_PLAIN |
||||
raise CFFormatError.new("Format #{format} not supported, use List::FORMAT_BINARY or List::FORMAT_XML") |
||||
end |
||||
|
||||
prsr = @@parsers[format-1].new |
||||
|
||||
opts[:root] = @value |
||||
opts[:formatted] = @formatted unless opts.has_key?(:formatted) |
||||
|
||||
return prsr.to_str(opts) |
||||
end |
||||
end |
||||
end |
||||
|
||||
|
||||
class Array |
||||
# convert an array to plist format |
||||
def to_plist(options={}) |
||||
options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY |
||||
|
||||
plist = CFPropertyList::List.new |
||||
plist.value = CFPropertyList.guess(self, options) |
||||
plist.to_str(options[:plist_format], options) |
||||
end |
||||
end |
||||
|
||||
class Enumerator |
||||
# convert an array to plist format |
||||
def to_plist(options={}) |
||||
options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY |
||||
|
||||
plist = CFPropertyList::List.new |
||||
plist.value = CFPropertyList.guess(self, options) |
||||
plist.to_str(options[:plist_format], options) |
||||
end |
||||
end |
||||
|
||||
class Hash |
||||
# convert a hash to plist format |
||||
def to_plist(options={}) |
||||
options[:plist_format] ||= CFPropertyList::List::FORMAT_BINARY |
||||
|
||||
plist = CFPropertyList::List.new |
||||
plist.value = CFPropertyList.guess(self, options) |
||||
plist.to_str(options[:plist_format], options) |
||||
end |
||||
end |
||||
|
||||
# eof |
@ -1,349 +0,0 @@
@@ -1,349 +0,0 @@
|
||||
# -*- coding: utf-8 -*- |
||||
# |
||||
# CFTypes, e.g. CFString, CFInteger |
||||
# needed to create unambiguous plists |
||||
# |
||||
# Author:: Christian Kruse (mailto:cjk@wwwtech.de) |
||||
# Copyright:: Copyright (c) 2009 |
||||
# License:: MIT License |
||||
|
||||
require 'base64' |
||||
|
||||
module CFPropertyList |
||||
## |
||||
# Blob is intended to distinguish between a Ruby String instance that should |
||||
# be converted to a CFString type and a Ruby String instance that should be |
||||
# converted to a CFData type |
||||
class Blob < String |
||||
end |
||||
|
||||
## |
||||
# UidFixnum is intended to distinguish between a Ruby Integer |
||||
# instance that should be converted to a CFInteger/CFReal type and a |
||||
# Ruby Integer instance that should be converted to a CFUid type. |
||||
class UidFixnum < Integer |
||||
end |
||||
|
||||
# This class defines the base class for all CFType classes |
||||
# |
||||
class CFType |
||||
# value of the type |
||||
attr_accessor :value |
||||
|
||||
def initialize(value=nil) |
||||
@value = value |
||||
end |
||||
|
||||
def to_xml(parser) |
||||
end |
||||
|
||||
def to_binary(bplist) |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
end |
||||
end |
||||
|
||||
# This class holds string values, both, UTF-8 and UTF-16BE |
||||
# It will convert the value to UTF-16BE if necessary (i.e. if non-ascii char contained) |
||||
class CFString < CFType |
||||
# convert to XML |
||||
def to_xml(parser) |
||||
n = parser.new_node('string') |
||||
n = parser.append_node(n, parser.new_text(@value)) unless @value.nil? |
||||
n |
||||
end |
||||
|
||||
# convert to binary |
||||
def to_binary(bplist) |
||||
bplist.string_to_binary(@value); |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
if @value =~ /^\w+$/ |
||||
@value |
||||
else |
||||
quoted |
||||
end |
||||
end |
||||
|
||||
def quoted |
||||
str = '"' |
||||
@value.each_char do |c| |
||||
str << case c |
||||
when '"' |
||||
'\\"' |
||||
when '\\' |
||||
'\\' |
||||
when "\a" |
||||
"\\a" |
||||
when "\b" |
||||
"\\b" |
||||
when "\f" |
||||
"\\f" |
||||
when "\n" |
||||
"\n" |
||||
when "\v" |
||||
"\\v" |
||||
when "\r" |
||||
"\\r" |
||||
when "\t" |
||||
"\\t" |
||||
else |
||||
c |
||||
end |
||||
end |
||||
|
||||
str << '"' |
||||
end |
||||
end |
||||
|
||||
# This class holds integer/fixnum values |
||||
class CFInteger < CFType |
||||
# convert to XML |
||||
def to_xml(parser) |
||||
n = parser.new_node('integer') |
||||
n = parser.append_node(n, parser.new_text(@value.to_s)) |
||||
n |
||||
end |
||||
|
||||
# convert to binary |
||||
def to_binary(bplist) |
||||
bplist.num_to_binary(self) |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
@value.to_s |
||||
end |
||||
end |
||||
|
||||
# This class holds float values |
||||
class CFReal < CFType |
||||
# convert to XML |
||||
def to_xml(parser) |
||||
n = parser.new_node('real') |
||||
n = parser.append_node(n, parser.new_text(@value.to_s)) |
||||
n |
||||
end |
||||
|
||||
# convert to binary |
||||
def to_binary(bplist) |
||||
bplist.num_to_binary(self) |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
@value.to_s |
||||
end |
||||
end |
||||
|
||||
# This class holds Time values. While Apple uses seconds since 2001, |
||||
# the rest of the world uses seconds since 1970. So if you access value |
||||
# directly, you get the Time class. If you access via get_value you either |
||||
# geht the timestamp or the Apple timestamp |
||||
class CFDate < CFType |
||||
TIMESTAMP_APPLE = 0 |
||||
TIMESTAMP_UNIX = 1 |
||||
DATE_DIFF_APPLE_UNIX = 978307200 |
||||
|
||||
# create a XML date strimg from a time object |
||||
def CFDate.date_string(val) |
||||
# 2009-05-13T20:23:43Z |
||||
val.getutc.strftime("%Y-%m-%dT%H:%M:%SZ") |
||||
end |
||||
|
||||
# parse a XML date string |
||||
def CFDate.parse_date(val) |
||||
# 2009-05-13T20:23:43Z |
||||
val =~ %r{^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$} |
||||
year,month,day,hour,min,sec = $1, $2, $3, $4, $5, $6 |
||||
return Time.utc(year,month,day,hour,min,sec).getlocal |
||||
end |
||||
|
||||
# set value to defined state |
||||
def initialize(value = nil,format=CFDate::TIMESTAMP_UNIX) |
||||
if(value.is_a?(Time) || value.nil?) then |
||||
@value = value.nil? ? Time.now : value |
||||
elsif value.instance_of? Date |
||||
@value = Time.utc(value.year, value.month, value.day, 0, 0, 0) |
||||
elsif value.instance_of? DateTime |
||||
@value = value.to_time.utc |
||||
else |
||||
set_value(value,format) |
||||
end |
||||
end |
||||
|
||||
# set value with timestamp, either Apple or UNIX |
||||
def set_value(value,format=CFDate::TIMESTAMP_UNIX) |
||||
if(format == CFDate::TIMESTAMP_UNIX) then |
||||
@value = Time.at(value) |
||||
else |
||||
@value = Time.at(value + CFDate::DATE_DIFF_APPLE_UNIX) |
||||
end |
||||
end |
||||
|
||||
# get timestamp, either UNIX or Apple timestamp |
||||
def get_value(format=CFDate::TIMESTAMP_UNIX) |
||||
if(format == CFDate::TIMESTAMP_UNIX) then |
||||
@value.to_i |
||||
else |
||||
@value.to_f - CFDate::DATE_DIFF_APPLE_UNIX |
||||
end |
||||
end |
||||
|
||||
# convert to XML |
||||
def to_xml(parser) |
||||
n = parser.new_node('date') |
||||
n = parser.append_node(n, parser.new_text(CFDate::date_string(@value))) |
||||
n |
||||
end |
||||
|
||||
# convert to binary |
||||
def to_binary(bplist) |
||||
bplist.date_to_binary(@value) |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
@value.strftime("%Y-%m-%d %H:%M:%S %z") |
||||
end |
||||
end |
||||
|
||||
# This class contains a boolean value |
||||
class CFBoolean < CFType |
||||
# convert to XML |
||||
def to_xml(parser) |
||||
parser.new_node(@value ? 'true' : 'false') |
||||
end |
||||
|
||||
# convert to binary |
||||
def to_binary(bplist) |
||||
bplist.bool_to_binary(@value); |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
@value ? "true" : "false" |
||||
end |
||||
end |
||||
|
||||
# This class contains binary data values |
||||
class CFData < CFType |
||||
# Base64 encoded data |
||||
DATA_BASE64 = 0 |
||||
# Raw data |
||||
DATA_RAW = 1 |
||||
|
||||
# set value to defined state, either base64 encoded or raw |
||||
def initialize(value=nil,format=DATA_BASE64) |
||||
if(format == DATA_RAW) |
||||
@raw_value = value |
||||
else |
||||
@value = value |
||||
end |
||||
end |
||||
|
||||
# get base64 encoded value |
||||
def encoded_value |
||||
@value ||= "\n#{Base64.encode64(@raw_value).gsub("\n", '').scan(/.{1,76}/).join("\n")}\n" |
||||
end |
||||
|
||||
# get base64 decoded value |
||||
def decoded_value |
||||
@raw_value ||= Blob.new(Base64.decode64(@value)) |
||||
end |
||||
|
||||
# convert to XML |
||||
def to_xml(parser) |
||||
n = parser.new_node('data') |
||||
n = parser.append_node(n, parser.new_text(encoded_value())) |
||||
n |
||||
end |
||||
|
||||
# convert to binary |
||||
def to_binary(bplist) |
||||
bplist.data_to_binary(decoded_value()) |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
"<" + decoded_value.unpack("H*").join("") + ">" |
||||
end |
||||
end |
||||
|
||||
# This class contains an array of values |
||||
class CFArray < CFType |
||||
# create a new array CFType |
||||
def initialize(val=[]) |
||||
@value = val |
||||
end |
||||
|
||||
# convert to XML |
||||
def to_xml(parser) |
||||
n = parser.new_node('array') |
||||
@value.each do |v| |
||||
n = parser.append_node(n, v.to_xml(parser)) |
||||
end |
||||
n |
||||
end |
||||
|
||||
# convert to binary |
||||
def to_binary(bplist) |
||||
bplist.array_to_binary(self) |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
ary = @value.map { |v| v.to_plain(plist) } |
||||
"( " + ary.join(", ") + " )" |
||||
end |
||||
end |
||||
|
||||
# this class contains a hash of values |
||||
class CFDictionary < CFType |
||||
# Create new CFDictonary type. |
||||
def initialize(value={}) |
||||
@value = value |
||||
end |
||||
|
||||
# convert to XML |
||||
def to_xml(parser) |
||||
n = parser.new_node('dict') |
||||
@value.each_pair do |key, value| |
||||
k = parser.append_node(parser.new_node('key'), parser.new_text(key.to_s)) |
||||
n = parser.append_node(n, k) |
||||
n = parser.append_node(n, value.to_xml(parser)) |
||||
end |
||||
n |
||||
end |
||||
|
||||
# convert to binary |
||||
def to_binary(bplist) |
||||
bplist.dict_to_binary(self) |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
str = "{ " |
||||
cfstr = CFString.new() |
||||
|
||||
@value.each do |k,v| |
||||
cfstr.value = k |
||||
str << cfstr.to_plain(plist) + " = " + v.to_plain(plist) + "; " |
||||
end |
||||
|
||||
str << "}" |
||||
end |
||||
end |
||||
|
||||
class CFUid < CFType |
||||
def to_xml(parser) |
||||
CFDictionary.new({'CF$UID' => CFInteger.new(@value)}).to_xml(parser) |
||||
end |
||||
|
||||
# convert to binary |
||||
def to_binary(bplist) |
||||
bplist.uid_to_binary(@value) |
||||
end |
||||
|
||||
def to_plain(plist) |
||||
CFDictionary.new({'CF$UID' => CFInteger.new(@value)}).to_plain(plist) |
||||
end |
||||
end |
||||
end |
||||
|
||||
# eof |
@ -1,149 +0,0 @@
@@ -1,149 +0,0 @@
|
||||
# -*- coding: utf-8 -*- |
||||
|
||||
require 'libxml' |
||||
|
||||
module CFPropertyList |
||||
# XML parser |
||||
class LibXMLParser < XMLParserInterface |
||||
LibXML::XML::Error.set_handler(&LibXML::XML::Error::QUIET_HANDLER) |
||||
PARSER_OPTIONS = LibXML::XML::Parser::Options::NOBLANKS|LibXML::XML::Parser::Options::NONET |
||||
# read a XML file |
||||
# opts:: |
||||
# * :file - The filename of the file to load |
||||
# * :data - The data to parse |
||||
def load(opts) |
||||
doc = nil |
||||
|
||||
if(opts.has_key?(:file)) then |
||||
doc = LibXML::XML::Document.file(opts[:file],:options => PARSER_OPTIONS) |
||||
else |
||||
doc = LibXML::XML::Document.string(opts[:data],:options => PARSER_OPTIONS) |
||||
end |
||||
|
||||
if doc |
||||
root = doc.root.first |
||||
return import_xml(root) |
||||
end |
||||
rescue LibXML::XML::Error => e |
||||
raise CFFormatError.new('invalid XML: ' + e.message) |
||||
end |
||||
|
||||
# serialize CFPropertyList object to XML |
||||
# opts = {}:: Specify options: :formatted - Use indention and line breaks |
||||
def to_str(opts={}) |
||||
doc = LibXML::XML::Document.new |
||||
|
||||
doc.root = LibXML::XML::Node.new('plist') |
||||
doc.encoding = LibXML::XML::Encoding::UTF_8 |
||||
|
||||
doc.root['version'] = '1.0' |
||||
doc.root << opts[:root].to_xml(self) |
||||
|
||||
# ugly hack, but there's no other possibility I know |
||||
str = doc.to_s(:indent => opts[:formatted]) |
||||
str1 = String.new |
||||
first = false |
||||
str.each_line do |line| |
||||
str1 << line |
||||
unless(first) then |
||||
str1 << "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" if line =~ /^\s*<\?xml/ |
||||
end |
||||
|
||||
first = true |
||||
end |
||||
|
||||
str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding) |
||||
return str1 |
||||
end |
||||
|
||||
def new_node(name) |
||||
LibXML::XML::Node.new(name) |
||||
end |
||||
|
||||
def new_text(val) |
||||
LibXML::XML::Node.new_text(val) |
||||
end |
||||
|
||||
def append_node(parent, child) |
||||
parent << child |
||||
end |
||||
|
||||
protected |
||||
|
||||
# get the value of a DOM node |
||||
def get_value(n) |
||||
content = if n.children? |
||||
n.first.content |
||||
else |
||||
n.content |
||||
end |
||||
|
||||
content.force_encoding('UTF-8') if content.respond_to?(:force_encoding) |
||||
content |
||||
end |
||||
|
||||
# import the XML values |
||||
def import_xml(node) |
||||
ret = nil |
||||
|
||||
case node.name |
||||
when 'dict' |
||||
hsh = Hash.new |
||||
key = nil |
||||
|
||||
if node.children? then |
||||
node.children.each do |n| |
||||
next if n.text? # avoid a bug of libxml |
||||
next if n.comment? |
||||
|
||||
if n.name == "key" then |
||||
key = get_value(n) |
||||
else |
||||
raise CFFormatError.new("Format error!") if key.nil? |
||||
hsh[key] = import_xml(n) |
||||
key = nil |
||||
end |
||||
end |
||||
end |
||||
|
||||
if hsh['CF$UID'] and hsh.keys.length == 1 |
||||
ret = CFUid.new(hsh['CF$UID'].value) |
||||
else |
||||
ret = CFDictionary.new(hsh) |
||||
end |
||||
|
||||
when 'array' |
||||
ary = Array.new |
||||
|
||||
if node.children? then |
||||
node.children.each do |n| |
||||
next if n.text? # avoid a bug of libxml |
||||
next if n.comment? |
||||
ary.push import_xml(n) |
||||
end |
||||
end |
||||
|
||||
ret = CFArray.new(ary) |
||||
|
||||
when 'true' |
||||
ret = CFBoolean.new(true) |
||||
when 'false' |
||||
ret = CFBoolean.new(false) |
||||
when 'real' |
||||
ret = CFReal.new(get_value(node).to_f) |
||||
when 'integer' |
||||
ret = CFInteger.new(get_value(node).to_i) |
||||
when 'string' |
||||
ret = CFString.new(get_value(node)) |
||||
when 'data' |
||||
ret = CFData.new(get_value(node)) |
||||
when 'date' |
||||
ret = CFDate.new(CFDate.parse_date(get_value(node))) |
||||
end |
||||
|
||||
return ret |
||||
end |
||||
end |
||||
end |
||||
|
||||
# eof |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue