1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 568079: Format C/C++ code

Added a new C/C++ formatter profile called "Unmanaged profile 'CDT'"
(name stolen from the Java formatter) that is basically K&R with the
tweak of maxium line width set to 120 (same width as for .java files).

Added enforcement of the formatter during build.

libspawner.so/jnilib have differences because the re-formatting changes
line numbers and therefore the __LINE__ macro expands to a different
value.

Change-Id: Id3a0619cb31640c7817dc684c72139f90cab0fc6
Signed-off-by: Torbjörn Svensson <azoff@svenskalinuxforeningen.se>
This commit is contained in:
Torbjörn Svensson 2020-10-21 19:59:07 +02:00 committed by Jonah Graham
parent 0429be17e1
commit c5a53bb7fe
55 changed files with 2025 additions and 1530 deletions

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %fragmentName.linux.aarch64 Bundle-Name: %fragmentName.linux.aarch64
Bundle-SymbolicName: org.eclipse.cdt.core.linux.aarch64;singleton:=true Bundle-SymbolicName: org.eclipse.cdt.core.linux.aarch64;singleton:=true
Bundle-Version: 6.0.0.qualifier Bundle-Version: 6.0.100.qualifier
Bundle-Vendor: %providerName Bundle-Vendor: %providerName
Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)" Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)"
Bundle-Localization: plugin Bundle-Localization: plugin

View file

@ -11,7 +11,7 @@
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<version>6.0.0-SNAPSHOT</version> <version>6.0.100-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.core.linux.aarch64</artifactId> <artifactId>org.eclipse.cdt.core.linux.aarch64</artifactId>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View file

@ -3,7 +3,7 @@ Bundle-SymbolicName: org.eclipse.cdt.core.linux.ppc64le;singleton:=true
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Localization: plugin Bundle-Localization: plugin
Bundle-Name: %fragmentName.linux.ppc64le Bundle-Name: %fragmentName.linux.ppc64le
Bundle-Version: 6.0.0.qualifier Bundle-Version: 6.0.100.qualifier
Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)" Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)"
Bundle-Vendor: %providerName Bundle-Vendor: %providerName
Eclipse-PlatformFilter: (&(osgi.os=linux)(osgi.arch=ppc64le)) Eclipse-PlatformFilter: (&(osgi.os=linux)(osgi.arch=ppc64le))

View file

@ -11,7 +11,7 @@
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<version>6.0.0-SNAPSHOT</version> <version>6.0.100-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.core.linux.ppc64le</artifactId> <artifactId>org.eclipse.cdt.core.linux.ppc64le</artifactId>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %fragmentName.linux.x86_64 Bundle-Name: %fragmentName.linux.x86_64
Bundle-SymbolicName: org.eclipse.cdt.core.linux.x86_64;singleton:=true Bundle-SymbolicName: org.eclipse.cdt.core.linux.x86_64;singleton:=true
Bundle-Version: 6.0.0.qualifier Bundle-Version: 6.0.100.qualifier
Bundle-Vendor: %providerName Bundle-Vendor: %providerName
Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)" Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)"
Bundle-Localization: plugin Bundle-Localization: plugin

View file

@ -11,7 +11,7 @@
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<version>6.0.0-SNAPSHOT</version> <version>6.0.100-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.core.linux.x86_64</artifactId> <artifactId>org.eclipse.cdt.core.linux.x86_64</artifactId>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %fragmentName.macosx Bundle-Name: %fragmentName.macosx
Bundle-SymbolicName: org.eclipse.cdt.core.macosx; singleton:=true Bundle-SymbolicName: org.eclipse.cdt.core.macosx; singleton:=true
Bundle-Version: 6.0.0.qualifier Bundle-Version: 6.0.100.qualifier
Bundle-Vendor: %providerName Bundle-Vendor: %providerName
Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)" Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)"
Bundle-Localization: plugin Bundle-Localization: plugin

View file

@ -11,7 +11,7 @@
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<version>6.0.0-SNAPSHOT</version> <version>6.0.100-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.core.macosx</artifactId> <artifactId>org.eclipse.cdt.core.macosx</artifactId>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View file

@ -30,5 +30,6 @@
<nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.pde.PluginNature</nature> <nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature> <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
<nature>org.eclipse.cdt.core.cnature</nature>
</natures> </natures>
</projectDescription> </projectDescription>

View file

@ -0,0 +1,189 @@
eclipse.preferences.version=1
org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.cdt.core.formatter.alignment_for_assignment=16
org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80
org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.cdt.core.formatter.alignment_for_compact_if=16
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18
org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0
org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16
org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48
org.eclipse.cdt.core.formatter.alignment_for_expression_list=0
org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.cdt.core.formatter.alignment_for_lambda_expression=20
org.eclipse.cdt.core.formatter.alignment_for_member_access=0
org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16
org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_linkage_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.cdt.core.formatter.comment.line_up_line_comment_in_blocks_on_first_column=false
org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1
org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true
org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true
org.eclipse.cdt.core.formatter.comment_formatter_off_tag=@formatter\:off
org.eclipse.cdt.core.formatter.comment_formatter_on_tag=@formatter\:on
org.eclipse.cdt.core.formatter.compact_else_if=true
org.eclipse.cdt.core.formatter.continuation_indentation=2
org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.cdt.core.formatter.format_block_comment=true
org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.cdt.core.formatter.format_header_comment=true
org.eclipse.cdt.core.formatter.format_line_comment=true
org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false
org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_linkage=false
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false
org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false
org.eclipse.cdt.core.formatter.indent_empty_lines=false
org.eclipse.cdt.core.formatter.indent_label_compare_to_statements=true
org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.cdt.core.formatter.indentation.size=4
org.eclipse.cdt.core.formatter.insert_new_line_after_colon_in_constructor_initializer_list=insert
org.eclipse.cdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_structured_binding_name_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_lambda_return=insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_declarator_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_lambda_return=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_linkage_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_structured_binding_name_list=insert
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_declarator_list=insert
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_method_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_before_ref_qualifier_in_structured_binding=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.join_wrapped_lines=true
org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.cdt.core.formatter.lineSplit=120
org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.cdt.core.formatter.tabulation.char=tab
org.eclipse.cdt.core.formatter.tabulation.size=4
org.eclipse.cdt.core.formatter.use_comment_formatter_tag=true
org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false

View file

@ -0,0 +1,3 @@
eclipse.preferences.version=1
formatter_profile=_Unmanaged profile 'CDT'
formatter_settings_version=1

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %pluginName Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.core.native;singleton:=true Bundle-SymbolicName: org.eclipse.cdt.core.native;singleton:=true
Bundle-Version: 6.0.0.qualifier Bundle-Version: 6.0.100.qualifier
Bundle-Activator: org.eclipse.cdt.internal.core.natives.CNativePlugin Bundle-Activator: org.eclipse.cdt.internal.core.natives.CNativePlugin
Bundle-Vendor: %providerName Bundle-Vendor: %providerName
Bundle-Localization: plugin Bundle-Localization: plugin

View file

@ -19,14 +19,9 @@
#include <signal.h> #include <signal.h>
#include <errno.h> #include <errno.h>
extern pid_t exec0(const char *path, char *const argv[], extern pid_t exec0(const char *path, char *const argv[], char *const envp[], const char *dirpath, int channels[3]);
char *const envp[], const char *dirpath,
int channels[3]);
extern pid_t exec_pty(const char *path, char *const argv[], char *const envp[], const char *dirpath, int channels[3],
extern pid_t exec_pty(const char *path, char *const argv[], const char *pts_name, int fdm, int console);
char *const envp[], const char *dirpath,
int channels[3], const char *pts_name, int fdm,
int console);
extern int wait0(pid_t pid); extern int wait0(pid_t pid);

View file

@ -26,12 +26,10 @@
#include <termios.h> #include <termios.h>
/* from pfind.c */ /* from pfind.c */
extern char *pfind(const char *name, char * const envp[]); extern char* pfind(const char *name, char *const envp[]);
pid_t pid_t exec_pty(const char *path, char *const argv[], char *const envp[], const char *dirpath, int channels[3],
exec_pty(const char *path, char *const argv[], char *const envp[], const char *pts_name, int fdm, int console) {
const char *dirpath, int channels[3], const char *pts_name, int fdm, int console)
{
int pipe2[2]; int pipe2[2];
pid_t childpid; pid_t childpid;
char *full_path; char *full_path;
@ -39,7 +37,7 @@ exec_pty(const char *path, char *const argv[], char *const envp[],
/* /*
* We use pfind() to check that the program exists and is an executable. * We use pfind() to check that the program exists and is an executable.
* If not pass the error up. Also execve() wants a full path. * If not pass the error up. Also execve() wants a full path.
*/ */
full_path = pfind(path, envp); full_path = pfind(path, envp);
if (full_path == NULL) { if (full_path == NULL) {
fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : "");
@ -48,9 +46,9 @@ exec_pty(const char *path, char *const argv[], char *const envp[],
/* /*
* Make sure we can create our pipes before forking. * Make sure we can create our pipes before forking.
*/ */
if (channels != NULL && console) { if (channels != NULL && console) {
if (pipe(pipe2) < 0) { if (pipe(pipe2) < 0) {
fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno));
free(full_path); free(full_path);
return -1; return -1;
@ -60,7 +58,8 @@ exec_pty(const char *path, char *const argv[], char *const envp[],
childpid = fork(); childpid = fork();
if (childpid < 0) { if (childpid < 0) {
fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__, __LINE__, strerror(errno)); fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__,
__LINE__, strerror(errno));
free(full_path); free(full_path);
return -1; return -1;
} else if (childpid == 0) { /* child */ } else if (childpid == 0) { /* child */
@ -98,14 +97,14 @@ exec_pty(const char *path, char *const argv[], char *const envp[],
} }
/* redirections */ /* redirections */
dup2(fds, STDIN_FILENO); /* dup stdin */ dup2(fds, STDIN_FILENO); /* dup stdin */
dup2(fds, STDOUT_FILENO); /* dup stdout */ dup2(fds, STDOUT_FILENO); /* dup stdout */
if (console) { if (console) {
dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ dup2(pipe2[1], STDERR_FILENO); /* dup stderr */
} else { } else {
dup2(fds, STDERR_FILENO); /* dup stderr */ dup2(fds, STDERR_FILENO); /* dup stderr */
} }
close(fds); /* done with fds. */ close(fds); /* done with fds. */
} }
/* Close all the fd's in the child */ /* Close all the fd's in the child */
@ -147,7 +146,7 @@ exec_pty(const char *path, char *const argv[], char *const envp[],
} }
free(full_path); free(full_path);
return -1; /*NOT REACHED */ return -1; /*NOT REACHED */
} }
#ifdef __STAND_ALONE__ #ifdef __STAND_ALONE__
int main(int argc, char **argv, char **envp) { int main(int argc, char **argv, char **envp) {

View file

@ -23,12 +23,9 @@
#include <stdlib.h> #include <stdlib.h>
/* from pfind.c */ /* from pfind.c */
extern char *pfind(const char *name, char * const envp[]); extern char* pfind(const char *name, char *const envp[]);
pid_t pid_t exec0(const char *path, char *const argv[], char *const envp[], const char *dirpath, int channels[3]) {
exec0(const char *path, char *const argv[], char *const envp[],
const char *dirpath, int channels[3])
{
int pipe0[2], pipe1[2], pipe2[2]; int pipe0[2], pipe1[2], pipe2[2];
pid_t childpid; pid_t childpid;
char *full_path; char *full_path;
@ -36,7 +33,7 @@ exec0(const char *path, char *const argv[], char *const envp[],
/* /*
* We use pfind() to check that the program exists and is an executable. * We use pfind() to check that the program exists and is an executable.
* If not pass the error up. Also execve() wants a full path. * If not pass the error up. Also execve() wants a full path.
*/ */
full_path = pfind(path, envp); full_path = pfind(path, envp);
if (full_path == NULL) { if (full_path == NULL) {
fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : ""); fprintf(stderr, "Unable to find full path for \"%s\"\n", (path) ? path : "");
@ -45,11 +42,11 @@ exec0(const char *path, char *const argv[], char *const envp[],
/* /*
* Make sure we can create our pipes before forking. * Make sure we can create our pipes before forking.
*/ */
if (channels != NULL) { if (channels != NULL) {
if (pipe(pipe0) < 0 || pipe(pipe1) < 0 || pipe(pipe2) < 0) { if (pipe(pipe0) < 0 || pipe(pipe1) < 0 || pipe(pipe2) < 0) {
fprintf(stderr, "%s(%d): returning due to error.\n", fprintf(stderr, "%s(%d): returning due to error.\n", __FUNCTION__,
__FUNCTION__, __LINE__); __LINE__);
free(full_path); free(full_path);
return -1; return -1;
} }
@ -58,8 +55,8 @@ exec0(const char *path, char *const argv[], char *const envp[],
childpid = fork(); childpid = fork();
if (childpid < 0) { if (childpid < 0) {
fprintf(stderr, "%s(%d): returning due to error: %s\n", fprintf(stderr, "%s(%d): returning due to error: %s\n", __FUNCTION__,
__FUNCTION__, __LINE__, strerror(errno)); __LINE__, strerror(errno));
free(full_path); free(full_path);
return -1; return -1;
} else if (childpid == 0) { /* child */ } else if (childpid == 0) { /* child */
@ -81,9 +78,9 @@ exec0(const char *path, char *const argv[], char *const envp[],
perror("close(pipe2[0]))"); perror("close(pipe2[0]))");
/* redirections */ /* redirections */
dup2(pipe0[0], STDIN_FILENO); /* dup stdin */ dup2(pipe0[0], STDIN_FILENO); /* dup stdin */
dup2(pipe1[1], STDOUT_FILENO); /* dup stdout */ dup2(pipe1[1], STDOUT_FILENO); /* dup stdout */
dup2(pipe2[1], STDERR_FILENO); /* dup stderr */ dup2(pipe2[1], STDERR_FILENO); /* dup stderr */
} }
/* Close all the fd's in the child */ /* Close all the fd's in the child */
@ -113,13 +110,13 @@ exec0(const char *path, char *const argv[], char *const envp[],
/* close the read end of pipe1 */ /* close the read end of pipe1 */
if (close(pipe0[0]) == -1) if (close(pipe0[0]) == -1)
perror("close(pipe0[0])"); perror("close(pipe0[0])");
/* close the write end of pipe2 */ /* close the write end of pipe2 */
if (close(pipe1[1]) == -1) if (close(pipe1[1]) == -1)
perror("close(pipe1[1])"); perror("close(pipe1[1])");
/* close the write end of pipe2 */ /* close the write end of pipe2 */
if (close(pipe2[1]) == -1) if (close(pipe2[1]) == -1)
perror("close(pipe2[1])"); perror("close(pipe2[1])");
channels[0] = pipe0[1]; /* Output Stream. */ channels[0] = pipe0[1]; /* Output Stream. */
@ -132,18 +129,16 @@ exec0(const char *path, char *const argv[], char *const envp[],
} }
free(full_path); free(full_path);
return -1; /*NOT REACHED */ return -1; /*NOT REACHED */
} }
int wait0(pid_t pid) {
int wait0(pid_t pid)
{
int status; int status;
int val = -1; int val = -1;
if (pid < 0) if (pid < 0)
return -1; return -1;
for (;;) { for (;;) {
if (waitpid(pid, &status, 0) < 0) { if (waitpid(pid, &status, 0) < 0) {
if (errno == EINTR) { if (errno == EINTR) {

View file

@ -21,113 +21,95 @@
/* Header for class _org_eclipse_cdt_utils_spawner_SpawnerInputStream */ /* Header for class _org_eclipse_cdt_utils_spawner_SpawnerInputStream */
/* Header for class _org_eclipse_cdt_utils_spawner_SpawnerOutputStream */ /* Header for class _org_eclipse_cdt_utils_spawner_SpawnerOutputStream */
static void ThrowByName(JNIEnv *env, const char *name, const char *msg) static void ThrowByName(JNIEnv *env, const char *name, const char *msg) {
{ jclass cls = (*env)->FindClass(env, name);
jclass cls = (*env)->FindClass(env, name);
if (cls != 0) /* Otherwise an exception has already been thrown */ if (cls != 0) /* Otherwise an exception has already been thrown */
(*env)->ThrowNew(env, cls, msg); (*env)->ThrowNew(env, cls, msg);
/* It's a good practice to clean up the local references. */ /* It's a good practice to clean up the local references. */
(*env)->DeleteLocalRef(env, cls); (*env)->DeleteLocalRef(env, cls);
} }
static int channelToFileDesc(JNIEnv * env, jobject channel) static int channelToFileDesc(JNIEnv *env, jobject channel) {
{ if (channel == 0) {
if (channel == 0) { ThrowByName(env, "java/io/IOException", "Invalid channel object");
ThrowByName(env, "java/io/IOException", "Invalid channel object"); return -1;
return -1; }
}
jclass cls = (*env)->GetObjectClass(env, channel); jclass cls = (*env)->GetObjectClass(env, channel);
if (cls == 0) { if (cls == 0) {
ThrowByName(env, "java/io/IOException", "Unable to get channel class"); ThrowByName(env, "java/io/IOException", "Unable to get channel class");
return -1; return -1;
} }
jfieldID fid = (*env)->GetFieldID(env, cls, "fd", "I"); jfieldID fid = (*env)->GetFieldID(env, cls, "fd", "I");
if (fid == 0) { if (fid == 0) {
ThrowByName(env, "java/io/IOException", "Unable to find fd"); ThrowByName(env, "java/io/IOException", "Unable to find fd");
return -1; return -1;
} }
jint fd = (*env)->GetIntField(env, channel, fid); jint fd = (*env)->GetIntField(env, channel, fid);
return fd; return fd;
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv * env, Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv *env, jobject jobj, jobject channel, jbyteArray buf,
jobject jobj, jint buf_len) {
jobject channel, int fd;
jbyteArray buf, int status;
jint buf_len) jbyte *data;
{ int data_len;
int fd;
int status;
jbyte *data;
int data_len;
data = (*env)->GetByteArrayElements(env, buf, 0); data = (*env)->GetByteArrayElements(env, buf, 0);
data_len = buf_len; data_len = buf_len;
fd = channelToFileDesc(env, channel); fd = channelToFileDesc(env, channel);
status = read( fd, data, data_len ); status = read(fd, data, data_len);
(*env)->ReleaseByteArrayElements(env, buf, data, 0); (*env)->ReleaseByteArrayElements(env, buf, data, 0);
if (status == 0) { if (status == 0) {
/* EOF. */ /* EOF. */
status = -1; status = -1;
} else if (status == -1) { } else if (status == -1) {
/* Error, toss an exception */ /* Error, toss an exception */
jclass exception = (*env)->FindClass(env, "java/io/IOException"); jclass exception = (*env)->FindClass(env, "java/io/IOException");
if (exception == NULL) { if (exception == NULL) {
/* Give up. */ /* Give up. */
return -1; return -1;
} }
(*env)->ThrowNew(env, exception, "read error"); (*env)->ThrowNew(env, exception, "read error");
} }
return status; return status;
}
JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv * env,
jobject jobj,
jobject channel)
{
int fd = channelToFileDesc(env, channel);
return close(fd);
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv * env, Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv *env, jobject jobj, jobject channel) {
jobject jobj, int fd = channelToFileDesc(env, channel);
jobject channel, return close(fd);
jbyteArray buf,
jint buf_len)
{
int status;
int fd;
jbyte *data;
int data_len;
data = (*env)->GetByteArrayElements(env, buf, 0);
data_len = buf_len;
fd = channelToFileDesc(env, channel);
status = write(fd, data, data_len);
(*env)->ReleaseByteArrayElements(env, buf, data, 0);
return status;
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv * env, Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv *env, jobject jobj, jobject channel,
jobject jobj, jbyteArray buf, jint buf_len) {
jobject channel) int status;
{ int fd;
int fd = channelToFileDesc(env, channel); jbyte *data;
return close(fd); int data_len;
data = (*env)->GetByteArrayElements(env, buf, 0);
data_len = buf_len;
fd = channelToFileDesc(env, channel);
status = write(fd, data, data_len);
(*env)->ReleaseByteArrayElements(env, buf, data, 0);
return status;
}
JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv *env, jobject jobj, jobject channel) {
int fd = channelToFileDesc(env, channel);
return close(fd);
} }

View file

@ -35,15 +35,13 @@
* Alain Magloire. * Alain Magloire.
*/ */
int ptym_open (char *pts_name); int ptym_open(char *pts_name);
int ptys_open (int fdm, const char * pts_name); int ptys_open(int fdm, const char *pts_name);
void set_noecho(int fd); void set_noecho(int fd);
int int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp) {
openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp)
{
char line[20]; char line[20];
line[0]=0; line[0] = 0;
*amaster = ptym_open(line); *amaster = ptym_open(line);
if (*amaster < 0) if (*amaster < 0)
return -1; return -1;
@ -67,12 +65,10 @@ openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct win
return 0; return 0;
} }
void void set_noecho(int fd) {
set_noecho(int fd)
{
struct termios stermios; struct termios stermios;
if (tcgetattr(fd, &stermios) < 0) { if (tcgetattr(fd, &stermios) < 0) {
return ; return;
} }
/* turn off echo */ /* turn off echo */
@ -85,9 +81,7 @@ set_noecho(int fd)
tcsetattr(fd, TCSANOW, &stermios); tcsetattr(fd, TCSANOW, &stermios);
} }
int int ptym_open(char *pts_name) {
ptym_open(char * pts_name)
{
int fdm; int fdm;
char *ptr; char *ptr;
@ -109,16 +103,14 @@ ptym_open(char * pts_name)
} }
ptr = ptsname(fdm); ptr = ptsname(fdm);
if (ptr == NULL) { /* get slave's name */ if (ptr == NULL) { /* get slave's name */
close (fdm); close(fdm);
return -4; return -4;
} }
strcpy(pts_name, ptr); /* return name of slave */ strcpy(pts_name, ptr); /* return name of slave */
return fdm; /* return fd of master */ return fdm; /* return fd of master */
} }
int int ptys_open(int fdm, const char *pts_name) {
ptys_open(int fdm, const char * pts_name)
{
int fds; int fds;
/* following should allocate controlling terminal */ /* following should allocate controlling terminal */
fds = open(pts_name, O_RDWR); fds = open(pts_name, O_RDWR);

View file

@ -15,7 +15,7 @@
*******************************************************************************/ *******************************************************************************/
#ifndef _OPENPTY_H #ifndef _OPENPTY_H
#define _OPENPTY_H #define _OPENPTY_H
int ptym_open (char *pts_name); int ptym_open(char *pts_name);
int ptys_open (int fdm, const char * pts_name); int ptys_open(int fdm, const char *pts_name);
void set_noecho(int fd); void set_noecho(int fd);
#endif #endif

View file

@ -32,28 +32,26 @@
#define PATH_DEF "PATH=" #define PATH_DEF "PATH="
const int path_def_len = 5; /* strlen(PATH_DEF); */ const int path_def_len = 5; /* strlen(PATH_DEF); */
char * path_val(char * const envp[]) char* path_val(char *const envp[]) {
{
int i; int i;
if (envp == NULL || envp[0] == NULL) if (envp == NULL || envp[0] == NULL)
return getenv("PATH" ); return getenv("PATH");
for(i = 0; envp[i] != NULL; i++){ for (i = 0; envp[i] != NULL; i++) {
char* p = envp[i]; char *p = envp[i];
if(!strncmp(PATH_DEF, p, path_def_len)){ if (!strncmp(PATH_DEF, p, path_def_len)) {
return p + path_def_len; return p + path_def_len;
} }
} }
return NULL; return NULL;
} }
char * pfind(const char *name, char * const envp[]) char* pfind(const char *name, char *const envp[]) {
{
char *tok; char *tok;
char *sp; char *sp;
char *path; char *path;
char fullpath[PATH_MAX+1]; char fullpath[PATH_MAX + 1];
struct stat sb; struct stat sb;
/* Sanity check. */ /* Sanity check. */
@ -71,7 +69,7 @@ char * pfind(const char *name, char * const envp[])
} }
/* Search in the PATH environment. */ /* Search in the PATH environment. */
path = path_val( envp ); path = path_val(envp);
if (path == NULL || strlen(path) <= 0) { if (path == NULL || strlen(path) <= 0) {
fprintf(stderr, "Unable to get $PATH.\n"); fprintf(stderr, "Unable to get $PATH.\n");
@ -92,7 +90,7 @@ char * pfind(const char *name, char * const envp[])
} }
} }
tok = strtok_r( NULL, ":", &sp ); tok = strtok_r(NULL, ":", &sp);
} }
free(path); free(path);

View file

@ -22,11 +22,11 @@
* Signature: ()I * Signature: ()I
*/ */
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *env, jobject jobj, jboolean console) { Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *env, jobject jobj, jboolean console) {
jfieldID fid; /* Store the field ID */ jfieldID fid; /* Store the field ID */
jstring jstr = NULL; jstring jstr = NULL;
int master = -1; int master = -1;
char line[1024]; /* FIXME: Should be enough */ char line[1024]; /* FIXME: Should be enough */
jclass cls; jclass cls;
line[0] = '\0'; line[0] = '\0';
@ -46,7 +46,7 @@ Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *env, jobject jobj, jboole
if (fid == NULL) { if (fid == NULL) {
return NULL; return NULL;
} }
(*env)->SetIntField(env, jobj, fid, (jint)master); (*env)->SetIntField(env, jobj, fid, (jint) master);
/* Create a new String for the slave. */ /* Create a new String for the slave. */
jstr = (*env)->NewStringUTF(env, line); jstr = (*env)->NewStringUTF(env, line);
@ -54,9 +54,8 @@ Java_org_eclipse_cdt_utils_pty_PTY_openMaster (JNIEnv *env, jobject jobj, jboole
return jstr; return jstr;
} }
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size(JNIEnv *env, jobject jobj, jint fdm,
(JNIEnv *env, jobject jobj, jint fdm, jint width, jint height) jint width, jint height) {
{
#ifdef TIOCSWINSZ #ifdef TIOCSWINSZ
struct winsize win; struct winsize win;

View file

@ -26,31 +26,26 @@
* Signature: (I)I * Signature: (I)I
*/ */
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv * env, Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv *env, jobject jobj, jint jfd, jbyteArray buf, jint buf_len) {
jobject jobj, int fd;
jint jfd, int status;
jbyteArray buf, jbyte *data;
jint buf_len) int data_len;
{
int fd;
int status;
jbyte *data;
int data_len;
data = (*env)->GetByteArrayElements(env, buf, 0); data = (*env)->GetByteArrayElements(env, buf, 0);
data_len = buf_len; data_len = buf_len;
fd = jfd; fd = jfd;
status = read( fd, data, data_len ); status = read(fd, data, data_len);
(*env)->ReleaseByteArrayElements(env, buf, data, 0); (*env)->ReleaseByteArrayElements(env, buf, data, 0);
if (status == 0) { if (status == 0) {
/* EOF. */ /* EOF. */
status = -1; status = -1;
} else if (status == -1) { } else if (status == -1) {
/* Error, toss an exception */ /* Error, toss an exception */
/* Ignore the error for now, the debugger will attempt /* Ignore the error for now, the debugger will attempt
* to close this multiple time. */ * to close this multiple time. */
#if 0 #if 0
jclass exception = (*env)->FindClass(env, "java/io/IOException"); jclass exception = (*env)->FindClass(env, "java/io/IOException");
if (exception == NULL) { if (exception == NULL) {
@ -59,23 +54,19 @@ Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv * env,
} }
(*env)->ThrowNew(env, exception, "read error"); (*env)->ThrowNew(env, exception, "read error");
#endif #endif
} }
return status; return status;
} }
/* /*
* Class: org_eclipse_cdt_utils_pty_PTYInputStream * Class: org_eclipse_cdt_utils_pty_PTYInputStream
* Method: close0 * Method: close0
* Signature: (I)I * Signature: (I)I
*/ */
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv * env, Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv *env, jobject jobj, jint fd) {
jobject jobj, return close(fd);
jint fd)
{
return close(fd);
} }
/* /*
@ -84,37 +75,28 @@ Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv * env,
* Signature: (II)I * Signature: (II)I
*/ */
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv * env, Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv *env, jobject jobj, jint jfd, jbyteArray buf, jint buf_len) {
jobject jobj, int status;
jint jfd, int fd;
jbyteArray buf, jbyte *data;
jint buf_len) int data_len;
{
int status;
int fd;
jbyte *data;
int data_len;
data = (*env)->GetByteArrayElements(env, buf, 0); data = (*env)->GetByteArrayElements(env, buf, 0);
data_len = buf_len; data_len = buf_len;
fd = jfd; fd = jfd;
status = write(fd, data, data_len); status = write(fd, data, data_len);
(*env)->ReleaseByteArrayElements(env, buf, data, 0); (*env)->ReleaseByteArrayElements(env, buf, data, 0);
return status; return status;
} }
/* /*
* Class: org_eclipse_cdt_utils_pty_PTYOutputStream * Class: org_eclipse_cdt_utils_pty_PTYOutputStream
* Method: close0 * Method: close0
* Signature: (I)I * Signature: (I)I
*/ */
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNIEnv * env, Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNIEnv *env, jobject jobj, jint fd) {
jobject jobj, return close(fd);
jint fd)
{
return close(fd);
} }

View file

@ -23,15 +23,12 @@
#include "exec0.h" #include "exec0.h"
#include <org_eclipse_cdt_utils_spawner_Spawner.h> #include <org_eclipse_cdt_utils_spawner_Spawner.h>
#define DEBUGIT 0 #define DEBUGIT 0
/* /*
* Header for class org_eclipse_cdt_utils_spawner_Spawner * Header for class org_eclipse_cdt_utils_spawner_Spawner
*/ */
#if DEBUGIT #if DEBUGIT
static void print_array(char **c_array) static void print_array(char **c_array)
{ {
@ -49,64 +46,56 @@ static void print_array(char **c_array)
} }
#endif #endif
static char** alloc_c_array(JNIEnv *env, jobjectArray j_array) {
int i;
jint c_array_size = (*env)->GetArrayLength(env, j_array);
char **c_array = calloc(c_array_size + 1, sizeof(*c_array));
static char **alloc_c_array(JNIEnv * env, jobjectArray j_array) if (c_array == NULL)
{ return NULL;
int i;
jint c_array_size = (*env)->GetArrayLength(env, j_array);
char **c_array = calloc(c_array_size + 1, sizeof(*c_array));
if (c_array == NULL) for (i = 0; i < c_array_size; i++) {
return NULL; jstring j_str = (jstring)(*env)->GetObjectArrayElement(env, j_array, i);
const char *c_str = (*env)->GetStringUTFChars(env, j_str, NULL);
c_array[i] = (char*) strdup(c_str);
(*env)->ReleaseStringUTFChars(env, j_str, c_str);
(*env)->DeleteLocalRef(env, j_str);
}
for (i = 0; i < c_array_size; i++) { return c_array;
jstring j_str =
(jstring) (*env)->GetObjectArrayElement(env, j_array, i);
const char *c_str = (*env)->GetStringUTFChars(env, j_str, NULL);
c_array[i] = (char *) strdup(c_str);
(*env)->ReleaseStringUTFChars(env, j_str, c_str);
(*env)->DeleteLocalRef(env, j_str);
}
return c_array;
} }
static void free_c_array(char **c_array) {
static void free_c_array(char **c_array) if (c_array) {
{ char **p = c_array;
if (c_array) { for (; *p; p++) {
char **p = c_array; if (*p) {
for (; *p; p++) { free(*p);
if (*p) { }
free(*p); }
} free(c_array);
} }
free(c_array);
}
} }
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2(JNIEnv *env, jobject jobj, jobjectArray jcmd,
jobjectArray jenv, jstring jdir, jobjectArray jchannels, jstring jslaveName, jint masterFD, jboolean console) {
const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL);
const char *pts_name = (*env)->GetStringUTFChars(env, jslaveName, NULL);
char **cmd = NULL;
char **envp = NULL;
int fd[3];
pid_t pid = -1;
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 if (jchannels == NULL)
(JNIEnv *env, jobject jobj, jobjectArray jcmd, jobjectArray jenv, jstring jdir, jobjectArray jchannels, goto bail_out;
jstring jslaveName, jint masterFD, jboolean console)
{
const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL);
const char *pts_name = (*env)->GetStringUTFChars(env, jslaveName, NULL);
char **cmd = NULL;
char **envp = NULL;
int fd[3];
pid_t pid = -1;
if (jchannels == NULL) cmd = alloc_c_array(env, jcmd);
goto bail_out; if (cmd == NULL)
goto bail_out;
cmd = alloc_c_array(env, jcmd); envp = alloc_c_array(env, jenv);
if (cmd == NULL) if (envp == NULL)
goto bail_out; goto bail_out;
envp = alloc_c_array(env, jenv);
if (envp == NULL)
goto bail_out;
#if DEBUGIT #if DEBUGIT
fprintf(stderr, "command:"); fprintf(stderr, "command:");
@ -117,47 +106,41 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2
fprintf(stderr, "pts_name: %s\n", pts_name); fprintf(stderr, "pts_name: %s\n", pts_name);
#endif #endif
pid = exec_pty(cmd[0], cmd, envp, dirpath, fd, pts_name, masterFD, console); pid = exec_pty(cmd[0], cmd, envp, dirpath, fd, pts_name, masterFD, console);
if (pid < 0) if (pid < 0)
goto bail_out; goto bail_out;
jobject cls = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel"); jobject cls = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel");
jmethodID constructor = (*env)->GetMethodID(env, cls, "<init>", "(I)V"); jmethodID constructor = (*env)->GetMethodID(env, cls, "<init>", "(I)V");
for (jsize i = 0; i < 3; i++) { for (jsize i = 0; i < 3; i++) {
jobject chan = (*env)->NewObject(env, cls, constructor, fd[i]); jobject chan = (*env)->NewObject(env, cls, constructor, fd[i]);
(*env)->SetObjectArrayElement(env, jchannels, i, chan); (*env)->SetObjectArrayElement(env, jchannels, i, chan);
} }
bail_out: (*env)->ReleaseStringUTFChars(env, jdir, dirpath);
bail_out: (*env)->ReleaseStringUTFChars(env, jslaveName, pts_name);
(*env)->ReleaseStringUTFChars(env, jdir, dirpath); if (cmd)
(*env)->ReleaseStringUTFChars(env, jslaveName, pts_name); free_c_array(cmd);
if (cmd) if (envp)
free_c_array(cmd); free_c_array(envp);
if (envp) return pid;
free_c_array(envp);
return pid;
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv * env, jobject jobj, Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv *env, jobject jobj, jobjectArray jcmd, jobjectArray jenv,
jobjectArray jcmd, jstring jdir) {
jobjectArray jenv, const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL);
jstring jdir) char **cmd = NULL;
{ char **envp = NULL;
const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); pid_t pid = -1;
char **cmd = NULL;
char **envp = NULL;
pid_t pid = -1;
cmd = alloc_c_array(env, jcmd); cmd = alloc_c_array(env, jcmd);
if (cmd == NULL) if (cmd == NULL)
goto bail_out; goto bail_out;
envp = alloc_c_array(env, jenv); envp = alloc_c_array(env, jenv);
if (envp == NULL) if (envp == NULL)
goto bail_out; goto bail_out;
#if DEBUGIT #if DEBUGIT
fprintf(stderr, "command:"); fprintf(stderr, "command:");
@ -167,52 +150,47 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv * env, jobject jobj,
fprintf(stderr, "dirpath: %s\n", dirpath); fprintf(stderr, "dirpath: %s\n", dirpath);
#endif #endif
pid = exec0(cmd[0], cmd, envp, dirpath, NULL); pid = exec0(cmd[0], cmd, envp, dirpath, NULL);
if (pid < 0) if (pid < 0)
goto bail_out; goto bail_out;
bail_out: bail_out: (*env)->ReleaseStringUTFChars(env, jdir, dirpath);
(*env)->ReleaseStringUTFChars(env, jdir, dirpath); if (cmd)
if (cmd) free_c_array(cmd);
free_c_array(cmd); if (envp)
if (envp) free_c_array(envp);
free_c_array(envp); return pid;
return pid;
} }
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv * env, jobject jobj, Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv *env, jobject jobj, jobjectArray jcmd, jobjectArray jenv,
jobjectArray jcmd, jstring jdir, jobjectArray jchannels) {
jobjectArray jenv, const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL);
jstring jdir, char **cmd = NULL;
jobjectArray jchannels) char **envp = NULL;
{ int fd[3];
const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); pid_t pid = -1;
char **cmd = NULL; jclass channelClass = NULL;
char **envp = NULL; jmethodID channelConstructor = NULL;
int fd[3];
pid_t pid = -1;
jclass channelClass = NULL;
jmethodID channelConstructor = NULL;
if (jchannels == NULL) if (jchannels == NULL)
goto bail_out; goto bail_out;
channelClass = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel"); channelClass = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel");
if (channelClass == 0) if (channelClass == 0)
goto bail_out; goto bail_out;
channelConstructor = (*env)->GetMethodID(env, channelClass, "<init>", "(I)V"); channelConstructor = (*env)->GetMethodID(env, channelClass, "<init>", "(I)V");
if (channelConstructor == 0) if (channelConstructor == 0)
goto bail_out; goto bail_out;
cmd = alloc_c_array(env, jcmd); cmd = alloc_c_array(env, jcmd);
if (cmd == NULL) if (cmd == NULL)
goto bail_out; goto bail_out;
envp = alloc_c_array(env, jenv); envp = alloc_c_array(env, jenv);
if (envp == NULL) if (envp == NULL)
goto bail_out; goto bail_out;
#if DEBUGIT #if DEBUGIT
fprintf(stderr, "command:"); fprintf(stderr, "command:");
@ -221,22 +199,21 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv * env, jobject jobj,
print_array(envp); print_array(envp);
fprintf(stderr, "dirpath: %s\n", dirpath); fprintf(stderr, "dirpath: %s\n", dirpath);
#endif #endif
pid = exec0(cmd[0], cmd, envp, dirpath, fd); pid = exec0(cmd[0], cmd, envp, dirpath, fd);
if (pid < 0) if (pid < 0)
goto bail_out; goto bail_out;
for (jsize i = 0; i < 3; i++) { for (jsize i = 0; i < 3; i++) {
jobject chan = (*env)->NewObject(env, channelClass, channelConstructor, fd[i]); jobject chan = (*env)->NewObject(env, channelClass, channelConstructor, fd[i]);
(*env)->SetObjectArrayElement(env, jchannels, i, chan); (*env)->SetObjectArrayElement(env, jchannels, i, chan);
} }
bail_out: bail_out: (*env)->ReleaseStringUTFChars(env, jdir, dirpath);
(*env)->ReleaseStringUTFChars(env, jdir, dirpath); if (cmd)
if (cmd) free_c_array(cmd);
free_c_array(cmd); if (envp)
if (envp) free_c_array(envp);
free_c_array(envp); return pid;
return pid;
} }
/* /*
@ -245,61 +222,55 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv * env, jobject jobj,
* Signature: (II)I * Signature: (II)I
*/ */
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv * env, jobject jobj, Java_org_eclipse_cdt_utils_spawner_Spawner_raise(JNIEnv *env, jobject jobj, jint pid, jint sig) {
jint pid, jint sig) int status = -1;
{
int status = -1;
switch (sig) { switch (sig) {
case 0: /* NOOP */ case 0: /* NOOP */
status = killpg(pid, 0); status = killpg(pid, 0);
if(status == -1) { if (status == -1) {
status = kill(pid, 0); status = kill(pid, 0);
} }
break; break;
case 2: /* INTERRUPT */ case 2: /* INTERRUPT */
status = killpg(pid, SIGINT); status = killpg(pid, SIGINT);
if(status == -1) { if (status == -1) {
status = kill(pid, SIGINT); status = kill(pid, SIGINT);
} }
break; break;
case 9: /* KILL */ case 9: /* KILL */
status = killpg(pid, SIGKILL); status = killpg(pid, SIGKILL);
if(status == -1) { if (status == -1) {
status = kill(pid, SIGKILL); status = kill(pid, SIGKILL);
} }
break; break;
case 15: /* TERM */ case 15: /* TERM */
status = killpg(pid, SIGTERM); status = killpg(pid, SIGTERM);
if(status == -1) { if (status == -1) {
status = kill(pid, SIGTERM); status = kill(pid, SIGTERM);
} }
break; break;
default: default:
status = killpg(pid, sig); /* WHAT ?? */ status = killpg(pid, sig); /* WHAT ?? */
if(status == -1) { if (status == -1) {
status = kill(pid, sig); /* WHAT ?? */ status = kill(pid, sig); /* WHAT ?? */
} }
break; break;
} }
return status; return status;
} }
/* /*
* Class: org_eclipse_cdt_utils_spawner_Spawner * Class: org_eclipse_cdt_utils_spawner_Spawner
* Method: waitFor * Method: waitFor
* Signature: (I)I * Signature: (I)I
*/ */
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor(JNIEnv * env, Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor(JNIEnv *env, jobject jobj, jint pid) {
jobject jobj, jint pid) return wait0(pid);
{
return wait0(pid);
} }

View file

@ -47,7 +47,7 @@ typedef struct winpty_s winpty_t;
* *
* This function creates a new agent process and connects to it. * This function creates a new agent process and connects to it.
*/ */
WINPTY_API winpty_t *winpty_open(int cols, int rows); WINPTY_API winpty_t* winpty_open(int cols, int rows);
/* /*
* Start a child process. Either (but not both) of appname and cmdline may * Start a child process. Either (but not both) of appname and cmdline may
@ -62,11 +62,8 @@ WINPTY_API winpty_t *winpty_open(int cols, int rows);
* *
* Returns 0 on success or a Win32 error code on failure. * Returns 0 on success or a Win32 error code on failure.
*/ */
WINPTY_API int winpty_start_process(winpty_t *pc, WINPTY_API int winpty_start_process(winpty_t *pc, const wchar_t *appname, const wchar_t *cmdline, const wchar_t *cwd,
const wchar_t *appname, const wchar_t *env);
const wchar_t *cmdline,
const wchar_t *cwd,
const wchar_t *env);
/* /*
* Returns the exit code of the process started with winpty_start_process, * Returns the exit code of the process started with winpty_start_process,

View file

@ -29,8 +29,7 @@ void ThrowByName(JNIEnv *env, const char *name, const char *msg);
#define BUFF_SIZE (1024) #define BUFF_SIZE (1024)
static HANDLE channelToHandle(JNIEnv * env, jobject channel) static HANDLE channelToHandle(JNIEnv *env, jobject channel) {
{
if (channel == 0) { if (channel == 0) {
ThrowByName(env, "java/io/IOException", "Invalid channel object"); ThrowByName(env, "java/io/IOException", "Invalid channel object");
return NULL; return NULL;
@ -49,47 +48,38 @@ static HANDLE channelToHandle(JNIEnv * env, jobject channel)
} }
jlong handle = (*env)->GetLongField(env, channel, fid); jlong handle = (*env)->GetLongField(env, channel, fid);
return (HANDLE)handle; return (HANDLE) handle;
} }
/* Inaccessible static: skipBuffer */ /* Inaccessible static: skipBuffer */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0 JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv *env, jobject proc,
(JNIEnv * env, jobject proc, jobject channel, jbyteArray buf, jint len) jobject channel, jbyteArray buf, jint len) {
{ jbyte tmpBuf[BUFF_SIZE];
jbyte tmpBuf[BUFF_SIZE];
int nBuffOffset = 0; int nBuffOffset = 0;
HANDLE handle = channelToHandle(env, channel); HANDLE handle = channelToHandle(env, channel);
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
_TCHAR buffer[1000]; _TCHAR buffer[1000];
#endif #endif
OVERLAPPED overlapped; OVERLAPPED overlapped;
overlapped.Offset = 0; overlapped.Offset = 0;
overlapped.OffsetHigh = 0; overlapped.OffsetHigh = 0;
overlapped.hEvent = CreateEvent(NULL, // no security attribute overlapped.hEvent = CreateEvent(NULL, // no security attribute
TRUE, // manual-reset event TRUE, // manual-reset event
TRUE, // initial state = signaled TRUE, // initial state = signaled
NULL); // unnamed event object NULL); // unnamed event object
if(NULL == overlapped.hEvent) { if (NULL == overlapped.hEvent) {
char * lpMsgBuf; char *lpMsgBuf;
FormatMessage( FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
FORMAT_MESSAGE_ALLOCATE_BUFFER | GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
FORMAT_MESSAGE_FROM_SYSTEM | (wchar_t*) &lpMsgBuf, 0, NULL);
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(wchar_t *) &lpMsgBuf,
0,
NULL
);
ThrowByName(env, "java/io/IOException", lpMsgBuf); ThrowByName(env, "java/io/IOException", lpMsgBuf);
// Free the buffer. // Free the buffer.
LocalFree( lpMsgBuf ); LocalFree(lpMsgBuf);
} }
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
@ -99,55 +89,41 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea
#endif #endif
#endif #endif
while(len > nBuffOffset) while (len > nBuffOffset) {
{
DWORD nNumberOfBytesToRead = min(len - nBuffOffset, BUFF_SIZE); DWORD nNumberOfBytesToRead = min(len - nBuffOffset, BUFF_SIZE);
DWORD nNumberOfBytesRead; DWORD nNumberOfBytesRead;
if(0 == ReadFile(handle, tmpBuf, nNumberOfBytesToRead, &nNumberOfBytesRead, &overlapped )) if (0 == ReadFile(handle, tmpBuf, nNumberOfBytesToRead, &nNumberOfBytesRead, &overlapped)) {
{
int err = GetLastError(); int err = GetLastError();
if(err == ERROR_IO_PENDING) if (err == ERROR_IO_PENDING) {
{
// asynchronous i/o is still in progress // asynchronous i/o is still in progress
// check on the results of the asynchronous read // check on the results of the asynchronous read
if(GetOverlappedResult(handle, &overlapped, if (GetOverlappedResult(handle, &overlapped, &nNumberOfBytesRead, TRUE))
&nNumberOfBytesRead, TRUE))
err = 0; err = 0;
// if there was a problem ... // if there was a problem ...
else else
err = GetLastError(); err = GetLastError();
} }
if(err == ERROR_BROKEN_PIPE) // Pipe was closed if (err == ERROR_BROKEN_PIPE) // Pipe was closed
break; break;
if(err != 0) if (err != 0) {
{ char *lpMsgBuf;
char * lpMsgBuf;
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
_stprintf(buffer, _T("Read failed - %i, error %i\n"), fd, err); _stprintf(buffer, _T("Read failed - %i, error %i\n"), fd, err);
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
#endif #endif
if(err != ERROR_MORE_DATA) // Otherwise error means just that there are more data if (err != ERROR_MORE_DATA) // Otherwise error means just that there are more data
{ // than buffer can accept { // than buffer can accept
FormatMessage( FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
FORMAT_MESSAGE_FROM_SYSTEM | NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
FORMAT_MESSAGE_IGNORE_INSERTS, (wchar_t*) &lpMsgBuf, 0, NULL);
NULL,
err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(wchar_t *) &lpMsgBuf,
0,
NULL
);
ThrowByName(env, "java/io/IOException", lpMsgBuf); ThrowByName(env, "java/io/IOException", lpMsgBuf);
LocalFree( lpMsgBuf ); LocalFree(lpMsgBuf);
nBuffOffset = 0; nBuffOffset = 0;
break; break;
} } else {
else
{
// buffer overflow? // buffer overflow?
// according to msdn this happens in message read mode only // according to msdn this happens in message read mode only
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
@ -156,26 +132,24 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea
#endif #endif
// nNumberOfBytesRead can be 0 here for unknown reason (bug 269223) // nNumberOfBytesRead can be 0 here for unknown reason (bug 269223)
nNumberOfBytesRead = nNumberOfBytesToRead; nNumberOfBytesRead = nNumberOfBytesToRead;
}
} }
} }
if(nNumberOfBytesRead > 0) }
if (nNumberOfBytesRead > 0)
(*env)->SetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesRead, tmpBuf); (*env)->SetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesRead, tmpBuf);
else else
break; break;
nBuffOffset += nNumberOfBytesRead; nBuffOffset += nNumberOfBytesRead;
if(nNumberOfBytesRead != nNumberOfBytesToRead) if (nNumberOfBytesRead != nNumberOfBytesToRead)
break; break;
else else {
{
// Is there data left in the pipe? // Is there data left in the pipe?
DWORD bytesAvailable = 0; DWORD bytesAvailable = 0;
if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytesAvailable, NULL) if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytesAvailable, NULL) || bytesAvailable == 0)
|| bytesAvailable == 0)
// No bytes left // No bytes left
break; break;
}
} }
}
CloseHandle(overlapped.hEvent); CloseHandle(overlapped.hEvent);
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
#ifdef READ_REPORT #ifdef READ_REPORT
@ -190,9 +164,8 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0 JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv *env, jobject proc,
(JNIEnv * env, jobject proc, jobject channel) jobject channel) {
{
int rc; int rc;
HANDLE handle = channelToHandle(env, channel); HANDLE handle = channelToHandle(env, channel);
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
@ -200,20 +173,19 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_clo
_stprintf(buffer, _T("Close %i\n"), fd); _stprintf(buffer, _T("Close %i\n"), fd);
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
#endif #endif
rc = (CloseHandle(handle) ? 0 : -1); rc = (CloseHandle(handle) ? 0 : -1);
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
_stprintf(buffer, _T("Closed %i\n"), fd); _stprintf(buffer, _T("Closed %i\n"), fd);
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
#endif #endif
return (rc ? GetLastError() : 0); return (rc ? GetLastError() : 0);
} }
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_available0 JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_available0(JNIEnv *env, jobject proc,
(JNIEnv * env, jobject proc, jobject channel) jobject channel) {
{
DWORD nAvail = 0; DWORD nAvail = 0;
HANDLE handle = channelToHandle(env, channel); HANDLE handle = channelToHandle(env, channel);
@ -227,48 +199,36 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_ava
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0 JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv *env, jobject proc,
(JNIEnv * env, jobject proc, jobject channel, jbyteArray buf, jint len) jobject channel, jbyteArray buf, jint len) {
{ jbyte tmpBuf[BUFF_SIZE];
jbyte tmpBuf[BUFF_SIZE];
int nBuffOffset = 0; int nBuffOffset = 0;
HANDLE handle = channelToHandle(env, channel); HANDLE handle = channelToHandle(env, channel);
while(len > nBuffOffset) while (len > nBuffOffset) {
{
DWORD nNumberOfBytesToWrite = min(len - nBuffOffset, BUFF_SIZE); DWORD nNumberOfBytesToWrite = min(len - nBuffOffset, BUFF_SIZE);
DWORD nNumberOfBytesWritten; DWORD nNumberOfBytesWritten;
(*env)->GetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesToWrite, tmpBuf); (*env)->GetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesToWrite, tmpBuf);
if(0 == WriteFile(handle, tmpBuf, nNumberOfBytesToWrite, &nNumberOfBytesWritten, NULL)) if (0 == WriteFile(handle, tmpBuf, nNumberOfBytesToWrite, &nNumberOfBytesWritten, NULL)) {
{ char *lpMsgBuf;
char * lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
FormatMessage( NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
FORMAT_MESSAGE_ALLOCATE_BUFFER | (wchar_t*) &lpMsgBuf, 0, NULL);
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(wchar_t *) &lpMsgBuf,
0,
NULL
);
ThrowByName(env, "java/io/IOException", lpMsgBuf); ThrowByName(env, "java/io/IOException", lpMsgBuf);
LocalFree( lpMsgBuf ); LocalFree(lpMsgBuf);
return 0; return 0;
}
nBuffOffset += nNumberOfBytesWritten;
} }
nBuffOffset += nNumberOfBytesWritten;
}
return 0; return 0;
} }
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0 JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv *env, jobject proc,
(JNIEnv * env, jobject proc, jobject channel) jobject channel) {
{
int rc; int rc;
HANDLE handle = channelToHandle(env, channel); HANDLE handle = channelToHandle(env, channel);
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
@ -276,11 +236,11 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_cl
_stprintf(buffer, _T("Close %i\n"), fd); _stprintf(buffer, _T("Close %i\n"), fd);
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
#endif #endif
FlushFileBuffers(handle); FlushFileBuffers(handle);
rc = (CloseHandle(handle) ? 0 : -1); rc = (CloseHandle(handle) ? 0 : -1);
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
_stprintf(buffer, _T("Closed %i\n"), fd); _stprintf(buffer, _T("Closed %i\n"), fd);
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
#endif #endif
return (rc ? GetLastError() : 0); return (rc ? GetLastError() : 0);
} }

View file

@ -32,8 +32,7 @@ static std::map<int, int> fd2rc;
* Method: openMaster * Method: openMaster
* Signature: (Z)Ljava/lang/String; * Signature: (Z)Ljava/lang/String;
*/ */
JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *env, jobject jobj, jboolean console) JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *env, jobject jobj, jboolean console) {
{
jfieldID fid; /* Store the field ID */ jfieldID fid; /* Store the field ID */
jstring jstr = NULL; jstring jstr = NULL;
jclass cls; jclass cls;
@ -44,18 +43,18 @@ JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *
line[0] = '\0'; line[0] = '\0';
/* Open new winpty handle */ /* Open new winpty handle */
winpty_t* winpty = winpty_open(80, 40); winpty_t *winpty = winpty_open(80, 40);
if (winpty == NULL) { if (winpty == NULL) {
return NULL; return NULL;
} }
/* Configure console mode */ /* Configure console mode */
if (console) { if (console) {
winpty_set_console_mode(winpty, 1); winpty_set_console_mode(winpty, 1);
} }
/* Generate masterFD based on current system time */ /* Generate masterFD based on current system time */
srand((unsigned int)time(NULL)); srand((unsigned int) time(NULL));
master = rand(); master = rand();
/* Make sure masterFD does not exist */ /* Make sure masterFD does not exist */
@ -64,9 +63,9 @@ JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *
sprintf(line, "winpty_%i", master); sprintf(line, "winpty_%i", master);
/* Remember the winpty handle for the generated masterFD */ /* Remember the winpty handle for the generated masterFD */
fd2pty.insert(std::pair<int, winpty_t*>(master, winpty)); fd2pty.insert(std::pair<int, winpty_t*>(master, winpty));
/* Get a reference to the obj's class */ /* Get a reference to the obj's class */
cls = env->GetObjectClass(jobj); cls = env->GetObjectClass(jobj);
@ -75,7 +74,7 @@ JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *
if (fid == NULL) { if (fid == NULL) {
return NULL; return NULL;
} }
env->SetIntField(jobj, fid, (jint)master); env->SetIntField(jobj, fid, (jint) master);
/* Create a new String for the slave. */ /* Create a new String for the slave. */
jstr = env->NewStringUTF(line); jstr = env->NewStringUTF(line);
@ -88,18 +87,18 @@ JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_pty_PTY_openMaster(JNIEnv *
* Method: change_window_size * Method: change_window_size
* Signature: (III)I * Signature: (III)I
*/ */
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size(JNIEnv *env, jobject jobj, jint fdm, jint width, jint height) JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size(JNIEnv *env, jobject jobj, jint fdm,
{ jint width, jint height) {
int fd; int fd;
std::map<int, winpty_t*> :: const_iterator fd2pty_Iter; std::map<int, winpty_t*>::const_iterator fd2pty_Iter;
fd = fdm; fd = fdm;
fd2pty_Iter = fd2pty.find(fd); fd2pty_Iter = fd2pty.find(fd);
if (fd2pty_Iter != fd2pty.end()) { if (fd2pty_Iter != fd2pty.end()) {
winpty_t* winpty = fd2pty_Iter -> second; winpty_t *winpty = fd2pty_Iter->second;
if (winpty != NULL) if (winpty != NULL)
return winpty_set_size(winpty, width, height); return winpty_set_size(winpty, width, height);
} }
return 0; return 0;
} }
@ -109,55 +108,54 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_change_1window_1size(J
* Method: read0 * Method: read0
* Signature: (I[BI)I * Signature: (I[BI)I
*/ */
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0 JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0(JNIEnv *env, jobject jobj, jint jfd,
(JNIEnv *env, jobject jobj, jint jfd, jbyteArray buf, jint buf_len) jbyteArray buf, jint buf_len) {
{
DWORD amount = -1; DWORD amount = -1;
OVERLAPPED over; OVERLAPPED over;
int fd; int fd;
std::map<int, winpty_t*> :: const_iterator fd2pty_Iter; std::map<int, winpty_t*>::const_iterator fd2pty_Iter;
fd = jfd; fd = jfd;
fd2pty_Iter = fd2pty.find(fd); fd2pty_Iter = fd2pty.find(fd);
if (fd2pty_Iter != fd2pty.end()) { if (fd2pty_Iter != fd2pty.end()) {
winpty_t* winpty = fd2pty_Iter -> second; winpty_t *winpty = fd2pty_Iter->second;
if (winpty != NULL) { if (winpty != NULL) {
/* Get the pipe handle */ /* Get the pipe handle */
HANDLE handle = winpty_get_data_pipe(winpty); HANDLE handle = winpty_get_data_pipe(winpty);
memset(&over, 0, sizeof(over)); memset(&over, 0, sizeof(over));
over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
char *buffer = new char[buf_len]; char *buffer = new char[buf_len];
memset(buffer, 0, sizeof(*buffer)); memset(buffer, 0, sizeof(*buffer));
jbyte *data = env->GetByteArrayElements(buf, 0); jbyte *data = env->GetByteArrayElements(buf, 0);
memset(data, 0, sizeof(*data)); memset(data, 0, sizeof(*data));
amount = 0; amount = 0;
BOOL ret = ReadFile(handle, buffer, buf_len, &amount, &over); BOOL ret = ReadFile(handle, buffer, buf_len, &amount, &over);
if (!ret) { if (!ret) {
DWORD error = GetLastError(); DWORD error = GetLastError();
if (error == ERROR_IO_PENDING) if (error == ERROR_IO_PENDING)
ret = GetOverlappedResult(handle, &over, &amount, TRUE); ret = GetOverlappedResult(handle, &over, &amount, TRUE);
} }
if (ret && amount > 0) if (ret && amount > 0)
memcpy(data, buffer, amount); memcpy(data, buffer, amount);
if (!ret || amount == 0) if (!ret || amount == 0)
amount = -1; amount = -1;
if (!ret && fd2pty.find(fd) != fd2pty.end()) { if (!ret && fd2pty.find(fd) != fd2pty.end()) {
int rc = winpty_get_exit_code(winpty); int rc = winpty_get_exit_code(winpty);
fd2rc.insert(std::pair<int, int>(fd, rc)); fd2rc.insert(std::pair<int, int>(fd, rc));
} }
delete[] buffer; delete[] buffer;
env->ReleaseByteArrayElements(buf, data, 0); env->ReleaseByteArrayElements(buf, data, 0);
ResetEvent(over.hEvent); ResetEvent(over.hEvent);
} }
} }
return amount; return amount;
} }
@ -167,21 +165,20 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_read0
* Method: close0 * Method: close0
* Signature: (I)I * Signature: (I)I
*/ */
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv *env, jobject jobj, jint jfd) JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIEnv *env, jobject jobj, jint jfd) {
{ int fd;
int fd; std::map<int, winpty_t*>::iterator fd2pty_Iter;
std::map<int, winpty_t*> :: iterator fd2pty_Iter;
fd = jfd; fd = jfd;
fd2pty_Iter = fd2pty.find(fd); fd2pty_Iter = fd2pty.find(fd);
if (fd2pty_Iter != fd2pty.end()) { if (fd2pty_Iter != fd2pty.end()) {
winpty_t* winpty = fd2pty_Iter -> second; winpty_t *winpty = fd2pty_Iter->second;
fd2pty.erase(fd2pty_Iter); fd2pty.erase(fd2pty_Iter);
if (winpty != NULL) { if (winpty != NULL) {
winpty_close(winpty); winpty_close(winpty);
winpty = NULL; winpty = NULL;
} }
} }
return 0; return 0;
} }
@ -191,41 +188,41 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYInputStream_close0(JNIE
* Method: write0 * Method: write0
* Signature: (I[BI)I * Signature: (I[BI)I
*/ */
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv *env, jobject jobj, jint jfd, jbyteArray buf, jint buf_len) JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNIEnv *env, jobject jobj, jint jfd,
{ jbyteArray buf, jint buf_len) {
DWORD written = -1; DWORD written = -1;
OVERLAPPED over; OVERLAPPED over;
int fd; int fd;
std::map<int, winpty_t*> :: iterator fd2pty_Iter; std::map<int, winpty_t*>::iterator fd2pty_Iter;
fd = jfd; fd = jfd;
fd2pty_Iter = fd2pty.find(fd); fd2pty_Iter = fd2pty.find(fd);
if (fd2pty_Iter != fd2pty.end()) { if (fd2pty_Iter != fd2pty.end()) {
winpty_t* winpty = fd2pty_Iter -> second; winpty_t *winpty = fd2pty_Iter->second;
if (winpty != NULL) { if (winpty != NULL) {
/* Get the pipe handle */ /* Get the pipe handle */
HANDLE handle = winpty_get_data_pipe(winpty); HANDLE handle = winpty_get_data_pipe(winpty);
memset(&over, 0, sizeof(over));
over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
char *buffer = new char[buf_len]; memset(&over, 0, sizeof(over));
memset(buffer, 0, sizeof(*buffer)); over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
jbyte *data = env->GetByteArrayElements(buf, 0); char *buffer = new char[buf_len];
memcpy(buffer, data, buf_len); memset(buffer, 0, sizeof(*buffer));
BOOL ret = WriteFile(handle, buffer, buf_len, &written, &over); jbyte *data = env->GetByteArrayElements(buf, 0);
env->ReleaseByteArrayElements(buf, data, 0); memcpy(buffer, data, buf_len);
if (!ret && GetLastError() == ERROR_IO_PENDING) BOOL ret = WriteFile(handle, buffer, buf_len, &written, &over);
ret = GetOverlappedResult(handle, &over, &written, TRUE); env->ReleaseByteArrayElements(buf, data, 0);
if (!ret || (int)written != buf_len)
written = -1;
delete[] buffer; if (!ret && GetLastError() == ERROR_IO_PENDING)
} ret = GetOverlappedResult(handle, &over, &written, TRUE);
} if (!ret || (int) written != buf_len)
written = -1;
delete[] buffer;
}
}
return written; return written;
} }
@ -235,21 +232,20 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_write0(JNI
* Method: close0 * Method: close0
* Signature: (I)I * Signature: (I)I
*/ */
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNIEnv *env, jobject jobj, jint jfd) JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNIEnv *env, jobject jobj, jint jfd) {
{ int fd;
int fd; std::map<int, winpty_t*>::iterator fd2pty_Iter;
std::map<int, winpty_t*> :: iterator fd2pty_Iter;
fd = jfd; fd = jfd;
fd2pty_Iter = fd2pty.find(fd); fd2pty_Iter = fd2pty.find(fd);
if (fd2pty_Iter != fd2pty.end()) { if (fd2pty_Iter != fd2pty.end()) {
winpty_t* winpty = fd2pty_Iter -> second; winpty_t *winpty = fd2pty_Iter->second;
fd2pty.erase(fd2pty_Iter); fd2pty.erase(fd2pty_Iter);
if (winpty != NULL) { if (winpty != NULL) {
winpty_close(winpty); winpty_close(winpty);
winpty = NULL; winpty = NULL;
} }
} }
return 0; return 0;
} }
@ -257,57 +253,52 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTYOutputStream_close0(JNI
/* /*
* Convert convert slashes to backslashes. * Convert convert slashes to backslashes.
*/ */
static std::wstring convertSlashes(const wchar_t *path) static std::wstring convertSlashes(const wchar_t *path) {
{ std::wstring ret;
std::wstring ret;
for (int i = 0; path[i] != L'\0'; ++i) { for (int i = 0; path[i] != L'\0'; ++i) {
if (path[i] == L'/') if (path[i] == L'/')
ret.push_back(L'\\'); ret.push_back(L'\\');
else else
ret.push_back(path[i]); ret.push_back(path[i]);
} }
return ret; return ret;
} }
// Convert argc/argv into a Win32 command-line following the escaping convention // Convert argc/argv into a Win32 command-line following the escaping convention
// documented on MSDN. (e.g. see CommandLineToArgvW documentation) // documented on MSDN. (e.g. see CommandLineToArgvW documentation)
static std::wstring argvToCommandLine(const std::vector<std::wstring> &argv) static std::wstring argvToCommandLine(const std::vector<std::wstring> &argv) {
{ std::wstring result;
std::wstring result; for (size_t argIndex = 0; argIndex < argv.size(); ++argIndex) {
for (size_t argIndex = 0; argIndex < argv.size(); ++argIndex) { if (argIndex > 0)
if (argIndex > 0) result.push_back(L' ');
result.push_back(L' '); const wchar_t *arg = argv[argIndex].c_str();
const wchar_t *arg = argv[argIndex].c_str(); const bool quote = wcschr(arg, L' ') != NULL || wcschr(arg, L'\t') != NULL || *arg == L'\0';
const bool quote = if (quote)
wcschr(arg, L' ') != NULL || result.push_back(L'\"');
wcschr(arg, L'\t') != NULL || int bsCount = 0;
*arg == L'\0'; for (const wchar_t *p = arg; *p != L'\0'; ++p) {
if (quote) if (*p == L'\\') {
result.push_back(L'\"'); bsCount++;
int bsCount = 0; } else if (*p == L'\"') {
for (const wchar_t *p = arg; *p != L'\0'; ++p) { result.append(bsCount * 2 + 1, L'\\');
if (*p == L'\\') { result.push_back(L'\"');
bsCount++; bsCount = 0;
} else if (*p == L'\"') { } else {
result.append(bsCount * 2 + 1, L'\\'); result.append(bsCount, L'\\');
result.push_back(L'\"'); bsCount = 0;
bsCount = 0; result.push_back(*p);
} else { }
result.append(bsCount, L'\\'); }
bsCount = 0; if (quote) {
result.push_back(*p); result.append(bsCount * 2, L'\\');
} result.push_back(L'\"');
} } else {
if (quote) { result.append(bsCount, L'\\');
result.append(bsCount * 2, L'\\'); }
result.push_back(L'\"'); }
} else { return result;
result.append(bsCount, L'\\');
}
}
return result;
} }
/* /*
@ -315,70 +306,66 @@ static std::wstring argvToCommandLine(const std::vector<std::wstring> &argv)
* Method: exec2 * Method: exec2
* Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[ILjava/lang/String;IZ)I * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[ILjava/lang/String;IZ)I
*/ */
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_exec2 JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_exec2(JNIEnv *env, jobject jobj, jobjectArray jcmd,
(JNIEnv *env, jobject jobj, jobjectArray jcmd, jobjectArray jenv, jstring jdir, jobjectArray jchannels, jstring jslaveName, jint masterFD, jboolean console) jobjectArray jenv, jstring jdir, jobjectArray jchannels, jstring jslaveName, jint masterFD, jboolean console) {
{ int fd;
int fd; std::map<int, winpty_t*>::iterator fd2pty_Iter;
std::map<int, winpty_t*> :: iterator fd2pty_Iter;
const wchar_t *cwdW = (const wchar_t *) env->GetStringChars(jdir, NULL); const wchar_t *cwdW = (const wchar_t*) env->GetStringChars(jdir, NULL);
const char *pts_name = env->GetStringUTFChars(jslaveName, NULL); const char *pts_name = env->GetStringUTFChars(jslaveName, NULL);
int pid = -1; int pid = -1;
int i; int i;
jint argc = env->GetArrayLength(jcmd); jint argc = env->GetArrayLength(jcmd);
jint envc = env->GetArrayLength(jenv); jint envc = env->GetArrayLength(jenv);
if (jchannels == NULL || env->GetArrayLength(jchannels) != 3) if (jchannels == NULL || env->GetArrayLength(jchannels) != 3)
goto bail_out; goto bail_out;
fd = masterFD; fd = masterFD;
fd2pty_Iter = fd2pty.find(fd); fd2pty_Iter = fd2pty.find(fd);
if (fd2pty_Iter != fd2pty.end()) { if (fd2pty_Iter != fd2pty.end()) {
winpty_t* winpty = fd2pty_Iter -> second; winpty_t *winpty = fd2pty_Iter->second;
if (winpty != NULL) { if (winpty != NULL) {
std::vector<std::wstring> argVector; std::vector < std::wstring > argVector;
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
jstring j_str = (jstring) env->GetObjectArrayElement(jcmd, i); jstring j_str = (jstring) env->GetObjectArrayElement(jcmd, i);
const wchar_t *w_str = (const wchar_t *) env->GetStringChars(j_str, NULL); const wchar_t *w_str = (const wchar_t*) env->GetStringChars(j_str, NULL);
if (i == 0) argVector.push_back(convertSlashes(w_str)); if (i == 0)
else argVector.push_back(w_str); argVector.push_back(convertSlashes(w_str));
env->ReleaseStringChars(j_str, (const jchar *) w_str); else
env->DeleteLocalRef(j_str); argVector.push_back(w_str);
} env->ReleaseStringChars(j_str, (const jchar*) w_str);
env->DeleteLocalRef(j_str);
}
std::wstring envp; std::wstring envp;
for (i = 0; i < envc; i++) { for (i = 0; i < envc; i++) {
jstring j_str = (jstring) env->GetObjectArrayElement(jenv, i); jstring j_str = (jstring) env->GetObjectArrayElement(jenv, i);
const wchar_t *w_str = (const wchar_t *) env->GetStringChars(j_str, NULL); const wchar_t *w_str = (const wchar_t*) env->GetStringChars(j_str, NULL);
envp.append(w_str); envp.append(w_str);
envp.push_back(L'\0'); envp.push_back(L'\0');
env->ReleaseStringChars(j_str, (const jchar *) w_str); env->ReleaseStringChars(j_str, (const jchar*) w_str);
env->DeleteLocalRef(j_str); env->DeleteLocalRef(j_str);
} }
std::wstring cmdLine = argvToCommandLine(argVector); std::wstring cmdLine = argvToCommandLine(argVector);
const wchar_t *cmdLineW = cmdLine.c_str(); const wchar_t *cmdLineW = cmdLine.c_str();
int ret = winpty_start_process(winpty, int ret = winpty_start_process(winpty, NULL, cmdLineW, cwdW, envp.c_str());
NULL,
cmdLineW,
cwdW,
envp.c_str());
if (ret == 0) { if (ret == 0) {
// Success. Get the process id. // Success. Get the process id.
pid = winpty_get_process_id(winpty); pid = winpty_get_process_id(winpty);
} }
} }
} }
bail_out: bail_out: env->ReleaseStringChars(jdir, (const jchar*) cwdW);
env->ReleaseStringChars(jdir, (const jchar *) cwdW); env->ReleaseStringUTFChars(jslaveName, pts_name);
env->ReleaseStringUTFChars(jslaveName, pts_name);
return pid; return pid;
} }
@ -388,35 +375,34 @@ bail_out:
* Method: waitFor * Method: waitFor
* Signature: (II)I * Signature: (II)I
*/ */
JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_waitFor JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_pty_PTY_waitFor(JNIEnv *env, jobject jobj, jint masterFD, jint pid) {
(JNIEnv *env, jobject jobj, jint masterFD, jint pid)
{
int status = -1; int status = -1;
DWORD flags; DWORD flags;
int fd; int fd;
std::map<int, winpty_t*> :: iterator fd2pty_Iter; std::map<int, winpty_t*>::iterator fd2pty_Iter;
std::map<int, int> :: iterator fd2rc_Iter; std::map<int, int>::iterator fd2rc_Iter;
fd = masterFD; fd = masterFD;
fd2pty_Iter = fd2pty.find(fd); fd2pty_Iter = fd2pty.find(fd);
if (fd2pty_Iter != fd2pty.end()) { if (fd2pty_Iter != fd2pty.end()) {
winpty_t* winpty = fd2pty_Iter -> second; winpty_t *winpty = fd2pty_Iter->second;
if (winpty != NULL) { if (winpty != NULL) {
HANDLE handle = winpty_get_data_pipe(winpty); HANDLE handle = winpty_get_data_pipe(winpty);
BOOL success; BOOL success;
do { do {
success = GetHandleInformation(handle, &flags); success = GetHandleInformation(handle, &flags);
if (success) Sleep(500); if (success)
} while (success); Sleep(500);
} while (success);
fd2rc_Iter = fd2rc.find(fd); fd2rc_Iter = fd2rc.find(fd);
if (fd2rc_Iter != fd2rc.end()) { if (fd2rc_Iter != fd2rc.end()) {
status = fd2rc_Iter -> second; status = fd2rc_Iter->second;
fd2rc.erase(fd2rc_Iter); fd2rc.erase(fd2rc_Iter);
} }
} }
} }
return status; return status;
} }

View file

@ -2,16 +2,11 @@
#include <windows.h> #include <windows.h>
#include <delayimp.h> #include <delayimp.h>
#include <assert.h> #include <assert.h>
#pragma comment(lib, "delayimp") #pragma comment(lib, "delayimp")
BOOL APIENTRY DllMain( HMODULE hModule, BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
DWORD ul_reason_for_call, switch (ul_reason_for_call) {
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH: case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH: case DLL_THREAD_DETACH:
@ -21,51 +16,42 @@ BOOL APIENTRY DllMain( HMODULE hModule,
return TRUE; return TRUE;
} }
static HMODULE getCurrentModule() static HMODULE getCurrentModule() {
{ HMODULE module;
HMODULE module; if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
if (!GetModuleHandleEx( (LPCTSTR) getCurrentModule, &module)) {
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | assert(false);
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, }
(LPCTSTR)getCurrentModule, return module;
&module)) {
assert(false);
}
return module;
} }
HMODULE PTYExplicitLoadLibrary( LPCSTR pszModuleName ) HMODULE PTYExplicitLoadLibrary(LPCSTR pszModuleName) {
{ if (lstrcmpiA(pszModuleName, "winpty.dll") == 0) {
if( lstrcmpiA( pszModuleName, "winpty.dll" ) == 0 ) CHAR szPath[MAX_PATH] = "";
{ //_hdllInstance is the HMODULE of *this* module
CHAR szPath[MAX_PATH] = ""; DWORD cchPath = GetModuleFileNameA(getCurrentModule(), szPath, MAX_PATH);
//_hdllInstance is the HMODULE of *this* module while (cchPath > 0) {
DWORD cchPath = GetModuleFileNameA(getCurrentModule(), szPath, MAX_PATH ); switch (szPath[cchPath - 1]) {
while( cchPath > 0 ) case '\\':
{ case '/':
switch( szPath[cchPath - 1] ) case ':':
{ break;
case '\\': default:
case '/': --cchPath;
case ':': continue;
break; }
default: break; //stop searching; found path separator
--cchPath; }
continue; lstrcpynA(szPath + cchPath, pszModuleName, MAX_PATH - cchPath);
} return LoadLibraryA(szPath); //call with full path to dependent DLL
break; //stop searching; found path separator }
} return NULL;
lstrcpynA( szPath + cchPath, pszModuleName, MAX_PATH - cchPath );
return LoadLibraryA( szPath ); //call with full path to dependent DLL
}
return NULL;
} }
FARPROC WINAPI PTYDliNotifyHook( unsigned dliNotify, PDelayLoadInfo pdli ) FARPROC WINAPI PTYDliNotifyHook(unsigned dliNotify, PDelayLoadInfo pdli) {
{ if (dliNotify == dliNotePreLoadLibrary)
if( dliNotify == dliNotePreLoadLibrary ) return (FARPROC) PTYExplicitLoadLibrary(pdli->szDll);
return (FARPROC)PTYExplicitLoadLibrary( pdli->szDll ); return NULL;
return NULL;
} }
extern "C" { extern "C" {

View file

@ -22,10 +22,8 @@
extern void JNICALL ThrowByName(JNIEnv *env, const char *name, const char *msg); extern void JNICALL ThrowByName(JNIEnv *env, const char *name, const char *msg);
static HWND consoleHWND; static HWND consoleHWND;
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
// Check if window is a console of process with pid // Check if window is a console of process with pid
// Arguments: // Arguments:
@ -34,33 +32,31 @@ static HWND consoleHWND;
// Return : TRUE if yes // Return : TRUE if yes
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
static BOOL CALLBACK static BOOL CALLBACK
find_child_console (HWND hwnd, LPARAM arg) find_child_console(HWND hwnd, LPARAM arg) {
{ DWORD thread_id;
DWORD thread_id; DWORD process_id;
DWORD process_id; DWORD pid = arg;
DWORD pid = arg;
thread_id = GetWindowThreadProcessId (hwnd, &process_id); thread_id = GetWindowThreadProcessId(hwnd, &process_id);
if (process_id == pid) if (process_id == pid) {
{ wchar_t window_class[32];
wchar_t window_class[32];
GetClassName (hwnd, window_class, sizeof (window_class)); GetClassName(hwnd, window_class, sizeof(window_class));
if (wcscmp (window_class, L"ConsoleWindowClass") == 0) if (wcscmp(window_class, L"ConsoleWindowClass") == 0) {
{ consoleHWND = hwnd;
consoleHWND = hwnd; return FALSE;
return FALSE;
} }
} }
/* keep looking */ /* keep looking */
return TRUE; return TRUE;
} }
// Need to declare this Win32 prototype ourselves. _WIN32_WINNT is getting // Need to declare this Win32 prototype ourselves. _WIN32_WINNT is getting
// defined to a Windows NT value, thus we don't get this. Can't assume // defined to a Windows NT value, thus we don't get this. Can't assume
// we're running on XP, anyway (or can we by now?) // we're running on XP, anyway (or can we by now?)
#if (_WIN32_WINNT < 0x0501) || defined(_MSC_VER) #if (_WIN32_WINNT < 0x0501) || defined(_MSC_VER)
typedef BOOL (WINAPI *DebugBreakProcessFunc)(HANDLE); typedef BOOL(WINAPI *DebugBreakProcessFunc)
(HANDLE);
#endif #endif
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
@ -76,28 +72,25 @@ typedef BOOL (WINAPI *DebugBreakProcessFunc)(HANDLE);
// pid - process' pid // pid - process' pid
// Return : 0 if OK or error code // Return : 0 if OK or error code
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
int interruptProcess(int pid) int interruptProcess(int pid) {
{
// See if DebugBreakProcess is available (XP and beyond) // See if DebugBreakProcess is available (XP and beyond)
HMODULE hmod = LoadLibrary(L"Kernel32.dll"); HMODULE hmod = LoadLibrary(L"Kernel32.dll");
if (hmod != NULL) if (hmod != NULL) {
{
BOOL success = FALSE; BOOL success = FALSE;
FARPROC procaddr = GetProcAddress(hmod, "DebugBreakProcess"); FARPROC procaddr = GetProcAddress(hmod, "DebugBreakProcess");
if (procaddr != NULL) if (procaddr != NULL) {
{ HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD) pid);
HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid); if (proc != NULL) {
if (proc != NULL) typedef BOOL WINAPI( *DebugBreakProcessFunc)
{ (HANDLE);
typedef BOOL WINAPI (*DebugBreakProcessFunc)(HANDLE); DebugBreakProcessFunc pDebugBreakProcess = (DebugBreakProcessFunc) procaddr;
DebugBreakProcessFunc pDebugBreakProcess = (DebugBreakProcessFunc)procaddr; success = (*pDebugBreakProcess)(proc);
success = (*pDebugBreakProcess)(proc);
CloseHandle(proc); CloseHandle(proc);
} }
} }
FreeLibrary(hmod); FreeLibrary(hmod);
hmod = NULL; hmod = NULL;
if (success) if (success)
return 0; // 0 == OK; if not, try old-school way return 0; // 0 == OK; if not, try old-school way
} }
@ -113,75 +106,65 @@ int interruptProcess(int pid)
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
#endif #endif
// Find console // Find console
EnumWindows (find_child_console, (LPARAM) pid); EnumWindows(find_child_console, (LPARAM) pid);
if(NULL != consoleHWND) // Yes, we found out it if (NULL != consoleHWND) // Yes, we found out it
{ {
// We are going to switch focus to console, // We are going to switch focus to console,
// send Ctrl-C and then restore focus // send Ctrl-C and then restore focus
BYTE control_scan_code = (BYTE) MapVirtualKey (VK_CONTROL, 0); BYTE control_scan_code = (BYTE) MapVirtualKey(VK_CONTROL, 0);
/* Fake Ctrl-C for SIGINT, and Ctrl-Break for SIGQUIT. */ /* Fake Ctrl-C for SIGINT, and Ctrl-Break for SIGQUIT. */
BYTE vk_c_code = 'C'; BYTE vk_c_code = 'C';
BYTE vk_break_code = VK_CANCEL; BYTE vk_break_code = VK_CANCEL;
BYTE c_scan_code = (BYTE) MapVirtualKey (vk_c_code, 0); BYTE c_scan_code = (BYTE) MapVirtualKey(vk_c_code, 0);
BYTE break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0); BYTE break_scan_code = (BYTE) MapVirtualKey(vk_break_code, 0);
HWND foreground_window; HWND foreground_window;
foreground_window = GetForegroundWindow (); foreground_window = GetForegroundWindow();
if (foreground_window) if (foreground_window) {
{ /* NT 5.0, and apparently also Windows 98, will not allow
/* NT 5.0, and apparently also Windows 98, will not allow a Window to be set to foreground directly without the
a Window to be set to foreground directly without the user's involvement. The workaround is to attach
user's involvement. The workaround is to attach ourselves to the thread that owns the foreground
ourselves to the thread that owns the foreground window, since that is the only thread that can set the
window, since that is the only thread that can set the foreground window. */
foreground window. */ DWORD foreground_thread, child_thread;
DWORD foreground_thread, child_thread; foreground_thread = GetWindowThreadProcessId(foreground_window, NULL);
foreground_thread = if (foreground_thread == GetCurrentThreadId()
GetWindowThreadProcessId (foreground_window, NULL); || !AttachThreadInput(GetCurrentThreadId(), foreground_thread, TRUE))
if (foreground_thread == GetCurrentThreadId () foreground_thread = 0;
|| !AttachThreadInput (GetCurrentThreadId (),
foreground_thread, TRUE))
foreground_thread = 0;
child_thread = GetWindowThreadProcessId (consoleHWND, NULL); child_thread = GetWindowThreadProcessId(consoleHWND, NULL);
if (child_thread == GetCurrentThreadId () if (child_thread == GetCurrentThreadId() || !AttachThreadInput(GetCurrentThreadId(), child_thread, TRUE))
|| !AttachThreadInput (GetCurrentThreadId (), child_thread = 0;
child_thread, TRUE))
child_thread = 0;
/* Set the foreground window to the child. */ /* Set the foreground window to the child. */
if (SetForegroundWindow (consoleHWND)) if (SetForegroundWindow(consoleHWND)) {
{ if (0 != break_scan_code) {
if(0 != break_scan_code) { /* Generate keystrokes as if user had typed Ctrl-Break */
/* Generate keystrokes as if user had typed Ctrl-Break */ keybd_event(VK_CONTROL, control_scan_code, 0, 0);
keybd_event (VK_CONTROL, control_scan_code, 0, 0); keybd_event(vk_break_code, break_scan_code, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event (vk_break_code, break_scan_code, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(vk_break_code, break_scan_code, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
keybd_event (vk_break_code, break_scan_code, keybd_event(VK_CONTROL, control_scan_code, KEYEVENTF_KEYUP, 0);
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); }
keybd_event (VK_CONTROL, control_scan_code, KEYEVENTF_KEYUP, 0);
}
/* Sleep for a bit to give time for respond */ /* Sleep for a bit to give time for respond */
Sleep (100); Sleep(100);
SetForegroundWindow (foreground_window); SetForegroundWindow(foreground_window);
} }
/* Detach from the foreground and child threads now that /* Detach from the foreground and child threads now that
the foreground switching is over. */ the foreground switching is over. */
if (foreground_thread) if (foreground_thread)
AttachThreadInput (GetCurrentThreadId (), AttachThreadInput(GetCurrentThreadId(), foreground_thread, FALSE);
foreground_thread, FALSE); if (child_thread)
if (child_thread) AttachThreadInput(GetCurrentThreadId(), child_thread, FALSE);
AttachThreadInput (GetCurrentThreadId (),
child_thread, FALSE);
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
_stprintf(buffer, _T("Sent Ctrl-C & Ctrl-Break to process %i\n"), pid); _stprintf(buffer, _T("Sent Ctrl-C & Ctrl-Break to process %i\n"), pid);
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
#endif #endif
} }
} }
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
else { else {
_stprintf(buffer, _T("Cannot find console for process %i\n"), pid); _stprintf(buffer, _T("Cannot find console for process %i\n"), pid);

View file

@ -23,38 +23,31 @@
CRITICAL_SECTION cs; CRITICAL_SECTION cs;
wchar_t path[MAX_PATH + 1] = { _T('\0') }; // Directory where spawner.dll is located
wchar_t path[MAX_PATH + 1] = {_T('\0') }; // Directory where spawner.dll is located
#if __cplusplus #if __cplusplus
extern "C" extern "C"
#endif #endif
BOOL APIENTRY DllMain( HINSTANCE hModule, BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
DWORD ul_reason_for_call, switch (ul_reason_for_call) {
LPVOID lpReserved case DLL_PROCESS_ATTACH: {
) wchar_t *p;
{ InitializeCriticalSection(&cs);
switch (ul_reason_for_call) GetModuleFileNameW(hModule, path, MAX_PATH);
{ p = wcsrchr(path, _T('\\'));
case DLL_PROCESS_ATTACH: if (NULL != p)
{ *(p + 1) = _T('\0');
wchar_t * p; else
InitializeCriticalSection(&cs); wcscat(path, L"\\");
GetModuleFileNameW(hModule, path, MAX_PATH); }
p = wcsrchr(path, _T('\\')); break;
if(NULL != p) case DLL_THREAD_ATTACH:
*(p + 1) = _T('\0'); case DLL_THREAD_DETACH:
else break;
wcscat(path, L"\\"); case DLL_PROCESS_DETACH:
} DeleteCriticalSection(&cs);
break; break;
case DLL_THREAD_ATTACH: }
case DLL_THREAD_DETACH: return TRUE;
break;
case DLL_PROCESS_DETACH:
DeleteCriticalSection(&cs);
break;
}
return TRUE;
} }

View file

@ -30,32 +30,30 @@
#define MAX_CMD_LINE_LENGTH (2049) #define MAX_CMD_LINE_LENGTH (2049)
#define PIPE_NAME_LENGTH 100 #define PIPE_NAME_LENGTH 100
int copyTo(wchar_t * target, const wchar_t * source, int cpyLength, int copyTo(wchar_t *target, const wchar_t *source, int cpyLength, int availSpace);
int availSpace);
void DisplayErrorMessage(); void DisplayErrorMessage();
//BOOL KillProcessEx(DWORD dwProcessId); // Handle of the process //BOOL KillProcessEx(DWORD dwProcessId); // Handle of the process
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
BOOL WINAPI HandlerRoutine( DWORD dwCtrlType) // control signal type BOOL WINAPI HandlerRoutine(DWORD dwCtrlType) // control signal type
{ {
BOOL ret = TRUE; BOOL ret = TRUE;
switch(dwCtrlType) switch (dwCtrlType) {
{ case CTRL_C_EVENT:
case CTRL_C_EVENT:
break; break;
case CTRL_BREAK_EVENT: case CTRL_BREAK_EVENT:
break; break;
case CTRL_CLOSE_EVENT: case CTRL_CLOSE_EVENT:
ret = FALSE; ret = FALSE;
break; break;
case CTRL_LOGOFF_EVENT: case CTRL_LOGOFF_EVENT:
ret = FALSE; ret = FALSE;
break; break;
case CTRL_SHUTDOWN_EVENT: case CTRL_SHUTDOWN_EVENT:
ret = FALSE; ret = FALSE;
break; break;
default: default:
break; break;
} }
return ret; return ret;
@ -63,24 +61,24 @@ BOOL WINAPI HandlerRoutine( DWORD dwCtrlType) // control signal type
// The default here means we haven't checked yet // The default here means we haven't checked yet
// i.e. cygwin is true but the bin dir hasn't been captured // i.e. cygwin is true but the bin dir hasn't been captured
wchar_t * cygwinBin = NULL; wchar_t *cygwinBin = NULL;
bool _isCygwin = true; bool _isCygwin = true;
bool isCygwin(HANDLE process) { bool isCygwin(HANDLE process) {
// Have we checked before? // Have we checked before?
if (cygwinBin != NULL || !_isCygwin) if (cygwinBin != NULL || !_isCygwin)
return _isCygwin; return _isCygwin;
// See if this process loaded cygwin, need a different SIGINT for them // See if this process loaded cygwin, need a different SIGINT for them
HMODULE mods[1024]; HMODULE mods[1024];
DWORD needed; DWORD needed;
if (EnumProcessModules(process, mods, sizeof(mods), &needed)) { if (EnumProcessModules(process, mods, sizeof(mods), &needed)) {
int i; int i;
needed /= sizeof(HMODULE); needed /= sizeof(HMODULE);
for (i = 0; i < needed; ++i ) { for (i = 0; i < needed; ++i) {
wchar_t modName[MAX_PATH]; wchar_t modName[MAX_PATH];
if (GetModuleFileNameEx(process, mods[i], modName, MAX_PATH)) { if (GetModuleFileNameEx(process, mods[i], modName, MAX_PATH)) {
wchar_t * p = wcsrchr(modName, L'\\'); wchar_t *p = wcsrchr(modName, L'\\');
if (p) { if (p) {
*p = 0; // Null terminate there for future reference *p = 0; // Null terminate there for future reference
if (!wcscmp(++p, L"cygwin1.dll")) { if (!wcscmp(++p, L"cygwin1.dll")) {
@ -93,15 +91,15 @@ bool isCygwin(HANDLE process) {
} }
} }
} }
_isCygwin = false; _isCygwin = false;
return _isCygwin; return _isCygwin;
} }
bool runCygwinCommand(wchar_t * command) { bool runCygwinCommand(wchar_t *command) {
wchar_t cygcmd[1024]; wchar_t cygcmd[1024];
swprintf(cygcmd, sizeof(cygcmd)/sizeof(cygcmd[0]), L"%s\\%s", cygwinBin, command); swprintf(cygcmd, sizeof(cygcmd) / sizeof(cygcmd[0]), L"%s\\%s", cygwinBin, command);
STARTUPINFO si; STARTUPINFO si;
ZeroMemory(&si, sizeof(si)); ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si); si.cb = sizeof(si);
@ -121,18 +119,18 @@ bool runCygwinCommand(wchar_t * command) {
return false; return false;
} }
void ensureSize(wchar_t** ptr, int* psize, int requiredLength) { void ensureSize(wchar_t **ptr, int *psize, int requiredLength) {
int size= *psize; int size = *psize;
if (requiredLength > size) { if (requiredLength > size) {
size= 2*size; size = 2 * size;
if (size < requiredLength) { if (size < requiredLength) {
size= requiredLength; size = requiredLength;
} }
*ptr= (wchar_t *)realloc(*ptr, size * sizeof(wchar_t)); *ptr = (wchar_t*) realloc(*ptr, size * sizeof(wchar_t));
if (NULL == *ptr) { if (NULL == *ptr) {
*psize= 0; *psize = 0;
} else { } else {
*psize= size; *psize = size;
} }
} }
} }
@ -140,27 +138,25 @@ void ensureSize(wchar_t** ptr, int* psize, int requiredLength) {
int main() { int main() {
int argc; int argc;
wchar_t ** argv = CommandLineToArgvW(GetCommandLine(), &argc); wchar_t **argv = CommandLineToArgvW(GetCommandLine(), &argc);
// Make sure that we've been passed the right number of arguments // Make sure that we've been passed the right number of arguments
if (argc < 8) { if (argc < 8) {
_tprintf(_T("Usage: %s (four inheritable event handles) (CommandLineToSpawn)\n"), _tprintf(_T("Usage: %s (four inheritable event handles) (CommandLineToSpawn)\n"), argv[0]);
argv[0]); return (0);
return(0);
} }
// Construct the full command line // Construct the full command line
int nCmdLineLength= MAX_CMD_LINE_LENGTH; int nCmdLineLength = MAX_CMD_LINE_LENGTH;
wchar_t * szCmdLine= (wchar_t *)malloc(nCmdLineLength * sizeof(wchar_t)); wchar_t *szCmdLine = (wchar_t*) malloc(nCmdLineLength * sizeof(wchar_t));
szCmdLine[0]= 0; szCmdLine[0] = 0;
int nPos = 0; int nPos = 0;
for(int i = 8; i < argc; ++i) for (int i = 8; i < argc; ++i) {
{
int nCpyLen; int nCpyLen;
int len= wcslen(argv[i]); int len = wcslen(argv[i]);
int requiredSize= nPos+len+2; int requiredSize = nPos + len + 2;
if (requiredSize > 32*1024) { if (requiredSize > 32 * 1024) {
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
OutputDebugStringW(_T("Command line too long!\n")); OutputDebugStringW(_T("Command line too long!\n"));
#endif #endif
@ -173,8 +169,7 @@ int main() {
#endif #endif
return 0; return 0;
} }
if(0 > (nCpyLen = copyTo(szCmdLine + nPos, argv[i], len, nCmdLineLength - nPos))) if (0 > (nCpyLen = copyTo(szCmdLine + nPos, argv[i], len, nCmdLineLength - nPos))) {
{
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
OutputDebugStringW(_T("Not enough space to build command line\n")); OutputDebugStringW(_T("Not enough space to build command line\n"));
#endif #endif
@ -186,8 +181,8 @@ int main() {
} }
szCmdLine[nPos] = _T('\0'); szCmdLine[nPos] = _T('\0');
STARTUPINFOW si = {sizeof(si)}; STARTUPINFOW si = { sizeof(si) };
PROCESS_INFORMATION pi = {0}; PROCESS_INFORMATION pi = { 0 };
DWORD dwExitCode = 0; DWORD dwExitCode = 0;
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
int currentPID = GetCurrentProcessId(); int currentPID = GetCurrentProcessId();
@ -202,7 +197,7 @@ int main() {
h[2] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[5]); // simulated SIGTERM h[2] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[5]); // simulated SIGTERM
h[3] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[6]); // simulated SIGKILL h[3] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[6]); // simulated SIGKILL
h[4] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[7]); // CTRL-C, in all cases h[4] = OpenEventW(EVENT_ALL_ACCESS, TRUE, argv[7]); // CTRL-C, in all cases
SetConsoleCtrlHandler(HandlerRoutine, TRUE); SetConsoleCtrlHandler(HandlerRoutine, TRUE);
int parentPid = wcstol(argv[1], NULL, 10); int parentPid = wcstol(argv[1], NULL, 10);
@ -211,9 +206,12 @@ int main() {
wchar_t outPipeName[PIPE_NAME_LENGTH]; wchar_t outPipeName[PIPE_NAME_LENGTH];
wchar_t errPipeName[PIPE_NAME_LENGTH]; wchar_t errPipeName[PIPE_NAME_LENGTH];
swprintf(inPipeName, sizeof(inPipeName)/sizeof(inPipeName[0]), L"\\\\.\\pipe\\stdin%08i%010i", parentPid, nCounter); swprintf(inPipeName, sizeof(inPipeName) / sizeof(inPipeName[0]), L"\\\\.\\pipe\\stdin%08i%010i", parentPid,
swprintf(outPipeName, sizeof(outPipeName)/sizeof(outPipeName[0]), L"\\\\.\\pipe\\stdout%08i%010i", parentPid, nCounter); nCounter);
swprintf(errPipeName, sizeof(errPipeName)/sizeof(errPipeName[0]), L"\\\\.\\pipe\\stderr%08i%010i", parentPid, nCounter); swprintf(outPipeName, sizeof(outPipeName) / sizeof(outPipeName[0]), L"\\\\.\\pipe\\stdout%08i%010i", parentPid,
nCounter);
swprintf(errPipeName, sizeof(errPipeName) / sizeof(errPipeName[0]), L"\\\\.\\pipe\\stderr%08i%010i", parentPid,
nCounter);
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
swprintf(buffer, _T("Pipes: %s, %s, %s\n"), inPipeName, outPipeName, errPipeName); swprintf(buffer, _T("Pipes: %s, %s, %s\n"), inPipeName, outPipeName, errPipeName);
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
@ -226,10 +224,14 @@ int main() {
sa.bInheritHandle = TRUE; sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL; sa.lpSecurityDescriptor = NULL;
if((INVALID_HANDLE_VALUE == (stdHandles[0] = CreateFileW(inPipeName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, &sa))) || if ((INVALID_HANDLE_VALUE
(INVALID_HANDLE_VALUE == (stdHandles[1] = CreateFileW(outPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, &sa))) || == (stdHandles[0] = CreateFileW(inPipeName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, &sa)))
(INVALID_HANDLE_VALUE == (stdHandles[2] = CreateFileW(errPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, &sa)))) || (INVALID_HANDLE_VALUE
{ == (stdHandles[1] = CreateFileW(outPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
0, &sa)))
|| (INVALID_HANDLE_VALUE
== (stdHandles[2] = CreateFileW(errPipeName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
0, &sa)))) {
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Failed to open pipe %i, %i, %i: %i\n"), stdHandles[0], stdHandles[1], stdHandles[2], GetLastError()); swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Failed to open pipe %i, %i, %i: %i\n"), stdHandles[0], stdHandles[1], stdHandles[2], GetLastError());
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
@ -243,9 +245,8 @@ int main() {
SetHandleInformation(stdHandles[1], HANDLE_FLAG_INHERIT, TRUE); SetHandleInformation(stdHandles[1], HANDLE_FLAG_INHERIT, TRUE);
SetHandleInformation(stdHandles[2], HANDLE_FLAG_INHERIT, TRUE); SetHandleInformation(stdHandles[2], HANDLE_FLAG_INHERIT, TRUE);
if(!SetStdHandle(STD_INPUT_HANDLE, stdHandles[0]) || if (!SetStdHandle(STD_INPUT_HANDLE, stdHandles[0]) || !SetStdHandle(STD_OUTPUT_HANDLE, stdHandles[1])
!SetStdHandle(STD_OUTPUT_HANDLE, stdHandles[1]) || || !SetStdHandle(STD_ERROR_HANDLE, stdHandles[2])) {
!SetStdHandle(STD_ERROR_HANDLE, stdHandles[2])) {
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Failed to reassign standard streams: %i\n"), GetLastError()); swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Failed to reassign standard streams: %i\n"), GetLastError());
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
@ -282,18 +283,18 @@ int main() {
// Create job object // Create job object
HANDLE hJob = CreateJobObject(NULL, NULL); HANDLE hJob = CreateJobObject(NULL, NULL);
if (hJob != NULL) { if (hJob != NULL) {
// Configure job to // Configure job to
// - terminate all associated processes when the last handle to it is closed // - terminate all associated processes when the last handle to it is closed
// - allow child processes to break away from the job. // - allow child processes to break away from the job.
JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo; JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo;
ZeroMemory(&jobInfo, sizeof(jobInfo)); ZeroMemory(&jobInfo, sizeof(jobInfo));
jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | JOB_OBJECT_LIMIT_BREAKAWAY_OK; jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | JOB_OBJECT_LIMIT_BREAKAWAY_OK;
if (!SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &jobInfo, sizeof(jobInfo))) { if (!SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &jobInfo, sizeof(jobInfo))) {
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
OutputDebugStringW(_T("Cannot set job information\n")); OutputDebugStringW(_T("Cannot set job information\n"));
DisplayErrorMessage(); DisplayErrorMessage();
#endif #endif
} }
} else { } else {
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
OutputDebugStringW(_T("Cannot create job object\n")); OutputDebugStringW(_T("Cannot create job object\n"));
@ -304,18 +305,16 @@ int main() {
// If this process is already part of a job, the flag CREATE_BREAKAWAY_FROM_JOB // If this process is already part of a job, the flag CREATE_BREAKAWAY_FROM_JOB
// makes the child process detach from the job, such that we can assign it // makes the child process detach from the job, such that we can assign it
// to our own job object. // to our own job object.
BOOL f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, BOOL f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi);
CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi);
// If breaking away from job is not permitted, retry without breakaway flag // If breaking away from job is not permitted, retry without breakaway flag
if (!f) if (!f)
f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
0, NULL, NULL, &si, &pi);
// We don't need them any more // We don't need them any more
CloseHandle(stdHandles[0]); CloseHandle(stdHandles[0]);
CloseHandle(stdHandles[1]); CloseHandle(stdHandles[1]);
CloseHandle(stdHandles[2]); CloseHandle(stdHandles[2]);
if (f) { if (f) {
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Process %i started\n"), pi.dwProcessId); swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Process %i started\n"), pi.dwProcessId);
@ -325,8 +324,8 @@ int main() {
CloseHandle(pi.hThread); CloseHandle(pi.hThread);
h[1] = pi.hProcess; h[1] = pi.hProcess;
if(NULL != hJob) { if (NULL != hJob) {
if(!AssignProcessToJobObject(hJob, pi.hProcess)) { if (!AssignProcessToJobObject(hJob, pi.hProcess)) {
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Cannot assign process %i to a job\n"), pi.dwProcessId); swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("Cannot assign process %i to a job\n"), pi.dwProcessId);
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
@ -335,13 +334,11 @@ int main() {
} }
} }
while(!exitProc) while (!exitProc) {
{
// Wait for the spawned-process to die or for the event // Wait for the spawned-process to die or for the event
// indicating that the processes should be forcibly killed. // indicating that the processes should be forcibly killed.
DWORD event = WaitForMultipleObjects(5, h, FALSE, INFINITE); DWORD event = WaitForMultipleObjects(5, h, FALSE, INFINITE);
switch (event) switch (event) {
{
case WAIT_OBJECT_0 + 0: // SIGINT case WAIT_OBJECT_0 + 0: // SIGINT
case WAIT_OBJECT_0 + 4: // CTRL-C case WAIT_OBJECT_0 + 4: // CTRL-C
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
@ -351,7 +348,7 @@ int main() {
if ((event == (WAIT_OBJECT_0 + 0)) && isCygwin(h[1])) { if ((event == (WAIT_OBJECT_0 + 0)) && isCygwin(h[1])) {
// Need to issue a kill command // Need to issue a kill command
wchar_t kill[1024]; wchar_t kill[1024];
swprintf(kill, sizeof(kill)/sizeof(kill[0]), L"kill -SIGINT %d", pi.dwProcessId); swprintf(kill, sizeof(kill) / sizeof(kill[0]), L"kill -SIGINT %d", pi.dwProcessId);
if (!runCygwinCommand(kill)) { if (!runCygwinCommand(kill)) {
// fall back to console event // fall back to console event
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
@ -374,14 +371,14 @@ int main() {
exitProc = TRUE; exitProc = TRUE;
break; break;
// Terminate and Kill behavior differ only for cygwin processes, where // Terminate and Kill behavior differ only for cygwin processes, where
// we use the cygwin 'kill' command. We send a SIGKILL in one case, // we use the cygwin 'kill' command. We send a SIGKILL in one case,
// SIGTERM in the other. For non-cygwin processes, both requests // SIGTERM in the other. For non-cygwin processes, both requests
// are treated exactly the same // are treated exactly the same
case WAIT_OBJECT_0 + 2: // TERM case WAIT_OBJECT_0 + 2: // TERM
case WAIT_OBJECT_0 + 3: // KILL case WAIT_OBJECT_0 + 3: // KILL
{ {
const wchar_t* signal = (event == WAIT_OBJECT_0 + 2) ? L"TERM" : L"KILL"; const wchar_t *signal = (event == WAIT_OBJECT_0 + 2) ? L"TERM" : L"KILL";
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("starter received %s event (PID %i)\n"), signal, currentPID); swprintf(buffer, sizeof(buffer)/sizeof(buffer[0]), _T("starter received %s event (PID %i)\n"), signal, currentPID);
OutputDebugStringW(buffer); OutputDebugStringW(buffer);
@ -389,19 +386,19 @@ int main() {
if (isCygwin(h[1])) { if (isCygwin(h[1])) {
// Need to issue a kill command // Need to issue a kill command
wchar_t kill[1024]; wchar_t kill[1024];
swprintf(kill, sizeof(kill)/sizeof(kill[0]), L"kill -%s %d", signal, pi.dwProcessId); swprintf(kill, sizeof(kill) / sizeof(kill[0]), L"kill -%s %d", signal, pi.dwProcessId);
if (!runCygwinCommand(kill)) { if (!runCygwinCommand(kill)) {
// fall back to console event // fall back to console event
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
} }
} else { } else {
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
} }
SetEvent(waitEvent); SetEvent(waitEvent);
if(NULL != hJob) { if (NULL != hJob) {
if(!TerminateJobObject(hJob, (DWORD)-1)) { if (!TerminateJobObject(hJob, (DWORD) - 1)) {
#ifdef DEBUG_MONITOR #ifdef DEBUG_MONITOR
OutputDebugStringW(_T("Cannot terminate job\n")); OutputDebugStringW(_T("Cannot terminate job\n"));
DisplayErrorMessage(); DisplayErrorMessage();
@ -432,8 +429,7 @@ int main() {
#endif #endif
} }
if (NULL != szCmdLine) if (NULL != szCmdLine) {
{
free(szCmdLine); free(szCmdLine);
} }
@ -444,7 +440,7 @@ int main() {
CloseHandle(h[3]); CloseHandle(h[3]);
CloseHandle(h[4]); CloseHandle(h[4]);
return(dwExitCode); return (dwExitCode);
} }
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
@ -456,8 +452,7 @@ int main() {
// availSpace - size of the target buffer // availSpace - size of the target buffer
// Return :number of bytes used in target, or -1 in case of error // Return :number of bytes used in target, or -1 in case of error
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
int copyTo(wchar_t * target, const wchar_t * source, int cpyLength, int copyTo(wchar_t *target, const wchar_t *source, int cpyLength, int availSpace) {
int availSpace) {
BOOL bSlash = FALSE; BOOL bSlash = FALSE;
int i = 0, j = 0; int i = 0, j = 0;
int totCpyLength = cpyLength; int totCpyLength = cpyLength;
@ -473,7 +468,7 @@ int copyTo(wchar_t * target, const wchar_t * source, int cpyLength,
if ((_T('\"') == *source) && (_T('\"') == *(source + cpyLength - 1))) { if ((_T('\"') == *source) && (_T('\"') == *(source + cpyLength - 1))) {
// Already done // Already done
nQuotationMode = QUOTATION_DONE; nQuotationMode = QUOTATION_DONE;
} else if (wcschr(source, _T(' '))== NULL) { } else if (wcschr(source, _T(' ')) == NULL) {
// No reason to quotate term becase it doesn't have embedded spaces // No reason to quotate term becase it doesn't have embedded spaces
nQuotationMode = QUOTATION_NONE; nQuotationMode = QUOTATION_NONE;
} else { } else {
@ -488,7 +483,7 @@ int copyTo(wchar_t * target, const wchar_t * source, int cpyLength,
bSlash = TRUE; bSlash = TRUE;
else else
// Don't escape embracing quotation marks // Don't escape embracing quotation marks
if ((source[i] == _T('\"')) && !((nQuotationMode == QUOTATION_DONE) && ((i == 0) || (i == (cpyLength - 1))) )) { if ((source[i] == _T('\"')) && !((nQuotationMode == QUOTATION_DONE) && ((i == 0) || (i == (cpyLength - 1))))) {
if (!bSlash) { if (!bSlash) {
if (j == availSpace) if (j == availSpace)
return -1; return -1;
@ -514,11 +509,10 @@ int copyTo(wchar_t * target, const wchar_t * source, int cpyLength,
} }
void DisplayErrorMessage() { void DisplayErrorMessage() {
wchar_t * lpMsgBuf; wchar_t *lpMsgBuf;
FormatMessageW( FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (wchar_t*) &lpMsgBuf, 0, NULL);
(wchar_t *) &lpMsgBuf, 0, NULL);
OutputDebugStringW(lpMsgBuf); OutputDebugStringW(lpMsgBuf);
// Free the buffer. // Free the buffer.
LocalFree(lpMsgBuf); LocalFree(lpMsgBuf);

View file

@ -23,7 +23,7 @@
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<version>6.0.0-SNAPSHOT</version> <version>6.0.100-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.core.native</artifactId> <artifactId>org.eclipse.cdt.core.native</artifactId>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View file

@ -1,5 +1,192 @@
#Wed Jun 06 11:37:01 EDT 2007
eclipse.preferences.version=1 eclipse.preferences.version=1
indexer/indexerId=org.eclipse.cdt.core.nullindexer indexer/indexerId=org.eclipse.cdt.core.nullindexer
indexerId=org.eclipse.cdt.core.nullindexer indexerId=org.eclipse.cdt.core.nullindexer
instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.cdt.core.formatter.alignment_for_assignment=16
org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80
org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.cdt.core.formatter.alignment_for_compact_if=16
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18
org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0
org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16
org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48
org.eclipse.cdt.core.formatter.alignment_for_expression_list=0
org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.cdt.core.formatter.alignment_for_lambda_expression=20
org.eclipse.cdt.core.formatter.alignment_for_member_access=0
org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16
org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_linkage_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.cdt.core.formatter.comment.line_up_line_comment_in_blocks_on_first_column=false
org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1
org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true
org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true
org.eclipse.cdt.core.formatter.comment_formatter_off_tag=@formatter\:off
org.eclipse.cdt.core.formatter.comment_formatter_on_tag=@formatter\:on
org.eclipse.cdt.core.formatter.compact_else_if=true
org.eclipse.cdt.core.formatter.continuation_indentation=2
org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.cdt.core.formatter.format_block_comment=true
org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.cdt.core.formatter.format_header_comment=true
org.eclipse.cdt.core.formatter.format_line_comment=true
org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false
org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_linkage=false
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false
org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false
org.eclipse.cdt.core.formatter.indent_empty_lines=false
org.eclipse.cdt.core.formatter.indent_label_compare_to_statements=true
org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.cdt.core.formatter.indentation.size=4
org.eclipse.cdt.core.formatter.insert_new_line_after_colon_in_constructor_initializer_list=insert
org.eclipse.cdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_structured_binding_name_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_lambda_return=insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_declarator_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_lambda_return=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_linkage_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_structured_binding_name_list=insert
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_declarator_list=insert
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_method_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_before_ref_qualifier_in_structured_binding=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.join_wrapped_lines=true
org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.cdt.core.formatter.lineSplit=120
org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.cdt.core.formatter.tabulation.char=tab
org.eclipse.cdt.core.formatter.tabulation.size=4
org.eclipse.cdt.core.formatter.use_comment_formatter_tag=true
org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false

View file

@ -0,0 +1,3 @@
eclipse.preferences.version=1
formatter_profile=_Unmanaged profile 'CDT'
formatter_settings_version=1

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %fragmentName.win32.x86_64 Bundle-Name: %fragmentName.win32.x86_64
Bundle-SymbolicName: org.eclipse.cdt.core.win32.x86_64;singleton:=true Bundle-SymbolicName: org.eclipse.cdt.core.win32.x86_64;singleton:=true
Bundle-Version: 6.0.0.qualifier Bundle-Version: 6.0.100.qualifier
Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)" Fragment-Host: org.eclipse.cdt.core.native;bundle-version="[6.0.0,7.0.0)"
Eclipse-PlatformFilter: (&(osgi.os=win32)(osgi.arch=x86_64)) Eclipse-PlatformFilter: (&(osgi.os=win32)(osgi.arch=x86_64))
Bundle-Vendor: %providerName Bundle-Vendor: %providerName

View file

@ -11,7 +11,7 @@
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<version>6.0.0-SNAPSHOT</version> <version>6.0.100-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.core.win32.x86_64</artifactId> <artifactId>org.eclipse.cdt.core.win32.x86_64</artifactId>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View file

@ -35,5 +35,6 @@
<nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.pde.PluginNature</nature> <nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature> <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
<nature>org.eclipse.cdt.core.cnature</nature>
</natures> </natures>
</projectDescription> </projectDescription>

View file

@ -0,0 +1,189 @@
eclipse.preferences.version=1
org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.cdt.core.formatter.alignment_for_assignment=16
org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80
org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.cdt.core.formatter.alignment_for_compact_if=16
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18
org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0
org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16
org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48
org.eclipse.cdt.core.formatter.alignment_for_expression_list=0
org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.cdt.core.formatter.alignment_for_lambda_expression=20
org.eclipse.cdt.core.formatter.alignment_for_member_access=0
org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16
org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_linkage_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.cdt.core.formatter.comment.line_up_line_comment_in_blocks_on_first_column=false
org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1
org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true
org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true
org.eclipse.cdt.core.formatter.comment_formatter_off_tag=@formatter\:off
org.eclipse.cdt.core.formatter.comment_formatter_on_tag=@formatter\:on
org.eclipse.cdt.core.formatter.compact_else_if=true
org.eclipse.cdt.core.formatter.continuation_indentation=2
org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.cdt.core.formatter.format_block_comment=true
org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.cdt.core.formatter.format_header_comment=true
org.eclipse.cdt.core.formatter.format_line_comment=true
org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false
org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_linkage=false
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false
org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false
org.eclipse.cdt.core.formatter.indent_empty_lines=false
org.eclipse.cdt.core.formatter.indent_label_compare_to_statements=true
org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.cdt.core.formatter.indentation.size=4
org.eclipse.cdt.core.formatter.insert_new_line_after_colon_in_constructor_initializer_list=insert
org.eclipse.cdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_structured_binding_name_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_lambda_return=insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_declarator_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_lambda_return=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_linkage_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_structured_binding_name_list=insert
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_declarator_list=insert
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_method_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_before_ref_qualifier_in_structured_binding=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.join_wrapped_lines=true
org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.cdt.core.formatter.lineSplit=120
org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.cdt.core.formatter.tabulation.char=tab
org.eclipse.cdt.core.formatter.tabulation.size=4
org.eclipse.cdt.core.formatter.use_comment_formatter_tag=true
org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false

View file

@ -0,0 +1,3 @@
eclipse.preferences.version=1
formatter_profile=_Unmanaged profile 'CDT'
formatter_settings_version=1

View file

@ -30,5 +30,6 @@
<nature>org.eclipse.pde.PluginNature</nature> <nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature> <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
<nature>org.eclipse.cdt.core.cnature</nature>
</natures> </natures>
</projectDescription> </projectDescription>

View file

@ -0,0 +1,189 @@
eclipse.preferences.version=1
org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.cdt.core.formatter.alignment_for_assignment=16
org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80
org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.cdt.core.formatter.alignment_for_compact_if=16
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34
org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18
org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0
org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16
org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48
org.eclipse.cdt.core.formatter.alignment_for_expression_list=0
org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.cdt.core.formatter.alignment_for_lambda_expression=20
org.eclipse.cdt.core.formatter.alignment_for_member_access=0
org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16
org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_linkage_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.cdt.core.formatter.comment.line_up_line_comment_in_blocks_on_first_column=false
org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1
org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true
org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true
org.eclipse.cdt.core.formatter.comment_formatter_off_tag=@formatter\:off
org.eclipse.cdt.core.formatter.comment_formatter_on_tag=@formatter\:on
org.eclipse.cdt.core.formatter.compact_else_if=true
org.eclipse.cdt.core.formatter.continuation_indentation=2
org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.cdt.core.formatter.format_block_comment=true
org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.cdt.core.formatter.format_header_comment=true
org.eclipse.cdt.core.formatter.format_line_comment=true
org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false
org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_linkage=false
org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false
org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false
org.eclipse.cdt.core.formatter.indent_empty_lines=false
org.eclipse.cdt.core.formatter.indent_label_compare_to_statements=true
org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.cdt.core.formatter.indentation.size=4
org.eclipse.cdt.core.formatter.insert_new_line_after_colon_in_constructor_initializer_list=insert
org.eclipse.cdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_structured_binding_name_list=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert
org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert
org.eclipse.cdt.core.formatter.insert_space_after_lambda_return=insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_opening_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_declarator_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_pointer_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_closing_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_structured_binding_name_list=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_lambda_return=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_linkage_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.cdt.core.formatter.insert_space_before_opening_structured_binding_name_list=insert
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_declarator_list=insert
org.eclipse.cdt.core.formatter.insert_space_before_pointer_in_method_declaration=insert
org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.cdt.core.formatter.insert_space_before_ref_qualifier_in_structured_binding=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.cdt.core.formatter.join_wrapped_lines=true
org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.cdt.core.formatter.lineSplit=120
org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.cdt.core.formatter.tabulation.char=tab
org.eclipse.cdt.core.formatter.tabulation.size=4
org.eclipse.cdt.core.formatter.use_comment_formatter_tag=true
org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false

View file

@ -0,0 +1,3 @@
eclipse.preferences.version=1
formatter_profile=_Unmanaged profile 'CDT'
formatter_settings_version=1

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %pluginName Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.native.serial Bundle-SymbolicName: org.eclipse.cdt.native.serial
Bundle-Version: 1.2.0.qualifier Bundle-Version: 1.2.100.qualifier
Bundle-Vendor: %providerName Bundle-Vendor: %providerName
Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-RequiredExecutionEnvironment: JavaSE-11
Export-Package: org.eclipse.cdt.serial Export-Package: org.eclipse.cdt.serial

View file

@ -50,7 +50,7 @@ static void closeAndthrowIOException(int fd, JNIEnv *env, const char *msg)
#else #else
static void closeAndthrowIOException(HANDLE handle, JNIEnv *env, const char *msg) static void closeAndthrowIOException(HANDLE handle, JNIEnv *env, const char *msg)
#endif #endif
{ {
char buff[256]; char buff[256];
#ifndef __MINGW32__ #ifndef __MINGW32__
sprintf(buff, "%s: %s", msg, strerror(errno)); sprintf(buff, "%s: %s", msg, strerror(errno));
@ -63,8 +63,7 @@ static void closeAndthrowIOException(HANDLE handle, JNIEnv *env, const char *msg
(*env)->ThrowNew(env, cls, buff); (*env)->ThrowNew(env, cls, buff);
} }
static void throwIOException(JNIEnv *env, const char *msg) static void throwIOException(JNIEnv *env, const char *msg) {
{
char buff[256]; char buff[256];
#ifndef __MINGW32__ #ifndef __MINGW32__
sprintf(buff, "%s: %s", msg, strerror(errno)); sprintf(buff, "%s: %s", msg, strerror(errno));
@ -75,10 +74,10 @@ static void throwIOException(JNIEnv *env, const char *msg)
(*env)->ThrowNew(env, cls, buff); (*env)->ThrowNew(env, cls, buff);
} }
JNIEXPORT jlong JNICALL FUNC(open0)(JNIEnv *env, jobject jobj, jstring portName, jint baudRate, jint byteSize, jint parity, jint stopBits) JNIEXPORT jlong JNICALL FUNC(open0)(JNIEnv *env, jobject jobj, jstring portName, jint baudRate, jint byteSize,
{ jint parity, jint stopBits) {
#ifndef __MINGW32__ #ifndef __MINGW32__
const char * cportName = (*env)->GetStringUTFChars(env, portName, NULL); const char *cportName = (*env)->GetStringUTFChars(env, portName, NULL);
int fd = open(cportName, O_RDWR | O_NOCTTY | O_NDELAY); int fd = open(cportName, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd < 0) { if (fd < 0) {
char msg[256]; char msg[256];
@ -255,12 +254,12 @@ JNIEXPORT jlong JNICALL FUNC(open0)(JNIEnv *env, jobject jobj, jstring portName,
// ignore parity // ignore parity
options.c_iflag |= IGNPAR; options.c_iflag |= IGNPAR;
// turn off those bits in the input flag that fiddle with CR and NL // turn off those bits in the input flag that fiddle with CR and NL
options.c_iflag &= ~(ICRNL | INLCR | IGNCR); options.c_iflag &= ~(ICRNL | INLCR | IGNCR);
options.c_cc[VMIN] = 0; // min chars to read options.c_cc[VMIN] = 0; // min chars to read
options.c_cc[VTIME] = 2; // 10ths second timeout options.c_cc[VTIME] = 2; // 10ths second timeout
tcflush(fd, TCIFLUSH); tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &options); tcsetattr(fd, TCSANOW, &options);
@ -342,7 +341,8 @@ JNIEXPORT jlong JNICALL FUNC(open0)(JNIEnv *env, jobject jobj, jstring portName,
#endif // __MINGW32__ #endif // __MINGW32__
} }
JNIEXPORT void JNICALL FUNC(close0)(JNIEnv *env, jobject jobj, jlong handle) JNIEXPORT void JNICALL FUNC(close0)
(JNIEnv *env, jobject jobj, jlong handle)
{ {
#ifndef __MINGW32__ #ifndef __MINGW32__
close(handle); close(handle);
@ -355,11 +355,10 @@ JNIEXPORT void JNICALL FUNC(close0)(JNIEnv *env, jobject jobj, jlong handle)
#endif #endif
} }
JNIEXPORT jint JNICALL FUNC(available0)(JNIEnv * env, jobject jobj, jlong jhandle) JNIEXPORT jint JNICALL FUNC(available0)(JNIEnv *env, jobject jobj, jlong jhandle) {
{
#ifndef __MINGW32__ #ifndef __MINGW32__
int result = 0; int result = 0;
if (ioctl(jhandle, FIONREAD, &result ) < 0) { if (ioctl(jhandle, FIONREAD, &result) < 0) {
throwIOException(env, "Error calling ioctl"); throwIOException(env, "Error calling ioctl");
return 0; return 0;
} }
@ -381,8 +380,7 @@ JNIEXPORT jint JNICALL FUNC(available0)(JNIEnv * env, jobject jobj, jlong jhandl
#endif #endif
} }
JNIEXPORT jint JNICALL FUNC(read1)(JNIEnv * env, jobject jobj, jlong jhandle, jbyteArray bytes, jint offset, jint size) JNIEXPORT jint JNICALL FUNC(read1)(JNIEnv *env, jobject jobj, jlong jhandle, jbyteArray bytes, jint offset, jint size) {
{
#ifndef __MINGW32__ #ifndef __MINGW32__
jbyte buff[256]; jbyte buff[256];
int n = size < sizeof(buff) ? size : sizeof(buff); int n = size < sizeof(buff) ? size : sizeof(buff);
@ -436,7 +434,8 @@ JNIEXPORT jint JNICALL FUNC(read1)(JNIEnv * env, jobject jobj, jlong jhandle, jb
#endif #endif
} }
JNIEXPORT void JNICALL FUNC(write0)(JNIEnv *env, jobject jobj, jlong jhandle, jint b) JNIEXPORT void JNICALL FUNC(write0)
(JNIEnv *env, jobject jobj, jlong jhandle, jint b)
{ {
#ifndef __MINGW32__ #ifndef __MINGW32__
char buff = b; char buff = b;

View file

@ -23,7 +23,7 @@
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<version>1.2.0-SNAPSHOT</version> <version>1.2.100-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.native.serial</artifactId> <artifactId>org.eclipse.cdt.native.serial</artifactId>
<packaging>eclipse-plugin</packaging> <packaging>eclipse-plugin</packaging>

View file

@ -88,6 +88,24 @@ git ls-files -- \*\*/.project ":!$COREPROJECT/.project" | while read i ; do
else else
rm -f $d/.settings/org.eclipse.pde*.prefs rm -f $d/.settings/org.eclipse.pde*.prefs
fi fi
# CDT (native code)
if [[ $natures == *"org.eclipse.cdt.core.cnature"* ]]; then
cp $COREPROJECT/.settings/org.eclipse.cdt.*.prefs $d/.settings
if echo $i | grep -E '\.tests?[/\.]' > /dev/null; then
# Disable indexer for test plugins
sed -i '
/^eclipse.preferences.version/ {
p # Print line
i indexer/indexerId=org.eclipse.cdt.core.nullindexer
i indexerId=org.eclipse.cdt.core.nullindexer
i instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
d # Already printed
}' $d/.settings/org.eclipse.cdt.core.prefs
fi
else
rm -f $d/.settings/org.eclipse.cdt.*.prefs
fi
done done
## ##

View file

@ -23,6 +23,15 @@ for p in native/org.eclipse.cdt.native.serial core/org.eclipse.cdt.core.native;
exit 1 exit 1
fi fi
# Disabled until https://bugs.eclipse.org/bugs/show_bug.cgi?id=568137 is resolved
# # Need to apply format after header files are generated
# tmpws=$(mktemp -d)
# ${ECLIPSE:-~/buildtools/eclipse-cpp-2020-09/eclipse} \
# -consolelog -nosplash -application org.eclipse.cdt.core.CodeFormatter \
# -config $p/.settings/org.eclipse.cdt.core.prefs \
# $p/native_src -verbose -data $tmpws
# rm -rf $tmpws
echo "Rebuilding $p natives to make sure they match source" echo "Rebuilding $p natives to make sure they match source"
logfile=make-natives-${p//\//-}.log logfile=make-natives-${p//\//-}.log
if ! make -C $p/native_src rebuild >${logfile} 2>&1; then if ! make -C $p/native_src rebuild >${logfile} 2>&1; then