File: Console.iOS.cs

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (128 lines) | stat: -rw-r--r-- 2,601 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//
// Helper for Console to allow indirect access to `stdout` using NSLog
//
// Authors:
//	Sebastien Pouliot  <sebastien@xamarin.com>
//
// Copyright 2012-2014 Xamarin Inc. All rights reserved.
//

#if MONOTOUCH

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace System {

	public static partial class Console {

		class NSLogWriter : TextWriter {
			[DllImport ("__Internal", CharSet=CharSet.Unicode)]
			extern static void xamarin_log (string s);

			[DllImport ("/usr/lib/libSystem.dylib")]
			extern static /* ssize_t */ IntPtr write (int fd, byte [] buffer, /* size_t */ IntPtr n);
			
			StringBuilder sb;
			
			public NSLogWriter ()
			{
				sb = new StringBuilder ();
			}
			
			public override System.Text.Encoding Encoding {
				get { return System.Text.Encoding.UTF8; }
			}

			static void direct_write_to_stdout (string s)
			{
				byte [] b = Encoding.Default.GetBytes (s);
				var len = (IntPtr) b.Length;
				while ((int) write (1, b, len) == -1 && Marshal.GetLastWin32Error () == /* EINTR*/ 4)
					;
			}
			
			public override void Flush ()
			{
				string s;
				lock (sb) {
					s = sb.ToString ();
					sb.Length = 0;
				}
				try {
					xamarin_log (s);
				}
				catch (Exception) {
					try {
						direct_write_to_stdout (s);
						direct_write_to_stdout (Environment.NewLine);
					} catch (Exception){}
				}
			}
			
			// minimum to override - see http://msdn.microsoft.com/en-us/library/system.io.textwriter.aspx
			public override void Write (char value)
			{
				try {
					lock (sb)
						sb.Append (value);
				}
				catch (Exception) {
				}
			}
			
			// optimization (to avoid concatening chars)
			public override void Write (string value)
			{
				try {
					lock (sb) {
						sb.Append (value);
						if (EndsWithNewLine (sb))
							Flush ();
					}
				}
				catch (Exception) {
				}
			}

			/* Called from TextWriter:WriteLine(string) */
			public override void Write(char[] buffer, int index, int count) {
				try {
					lock (sb) {
						sb.Append (buffer, index, count);
						if (EndsWithNewLine (sb))
							Flush ();
					}
				}
				catch (Exception) {
				}
			}
			
			bool EndsWithNewLine (StringBuilder value)
			{
				if (value.Length < CoreNewLine.Length)
					return false;

				for (int i = 0, v = value.Length - CoreNewLine.Length; i < CoreNewLine.Length; ++i, ++v) {
					if (value [v] != CoreNewLine [i])
						return false;
				}

				return true;
			}
			
			public override void WriteLine ()
			{
				try {
					Flush ();
				}
				catch (Exception) {
				}
			}
		}
	}
}

#endif