Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
619f16e1
Kaydet (Commit)
619f16e1
authored
Haz 09, 2010
tarafından
Antoine Pitrou
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Issue #8930: fix some C code indentation
üst
ae1bb9a0
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
285 additions
and
285 deletions
+285
-285
_codecsmodule.c
Modules/_codecsmodule.c
+68
-68
bytearrayobject.c
Objects/bytearrayobject.c
+45
-45
stringobject.c
Objects/stringobject.c
+172
-172
No files found.
Modules/_codecsmodule.c
Dosyayı görüntüle @
619f16e1
...
...
@@ -176,28 +176,28 @@ static PyObject *
escape_encode
(
PyObject
*
self
,
PyObject
*
args
)
{
PyObject
*
str
;
const
char
*
errors
=
NULL
;
char
*
buf
;
Py_ssize_t
consumed
,
len
;
if
(
!
PyArg_ParseTuple
(
args
,
"S|z:escape_encode"
,
&
str
,
&
errors
))
return
NULL
;
consumed
=
PyString_GET_SIZE
(
str
);
str
=
PyString_Repr
(
str
,
0
);
if
(
!
str
)
return
NULL
;
/* The string will be quoted. Unquote, similar to unicode-escape. */
buf
=
PyString_AS_STRING
(
str
);
len
=
PyString_GET_SIZE
(
str
);
memmove
(
buf
,
buf
+
1
,
len
-
2
);
if
(
_PyString_Resize
(
&
str
,
len
-
2
)
<
0
)
return
NULL
;
return
codec_tuple
(
str
,
consumed
);
PyObject
*
str
;
const
char
*
errors
=
NULL
;
char
*
buf
;
Py_ssize_t
consumed
,
len
;
if
(
!
PyArg_ParseTuple
(
args
,
"S|z:escape_encode"
,
&
str
,
&
errors
))
return
NULL
;
consumed
=
PyString_GET_SIZE
(
str
);
str
=
PyString_Repr
(
str
,
0
);
if
(
!
str
)
return
NULL
;
/* The string will be quoted. Unquote, similar to unicode-escape. */
buf
=
PyString_AS_STRING
(
str
);
len
=
PyString_GET_SIZE
(
str
);
memmove
(
buf
,
buf
+
1
,
len
-
2
);
if
(
_PyString_Resize
(
&
str
,
len
-
2
)
<
0
)
return
NULL
;
return
codec_tuple
(
str
,
consumed
);
}
#ifdef Py_USING_UNICODE
...
...
@@ -233,7 +233,7 @@ static PyObject *
utf_7_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
final
=
0
;
Py_ssize_t
consumed
;
...
...
@@ -246,7 +246,7 @@ utf_7_decode(PyObject *self,
decoded
=
PyUnicode_DecodeUTF7Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
decoded
==
NULL
)
return
NULL
;
return
codec_tuple
(
decoded
,
consumed
);
...
...
@@ -256,7 +256,7 @@ static PyObject *
utf_8_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
final
=
0
;
Py_ssize_t
consumed
;
...
...
@@ -269,7 +269,7 @@ utf_8_decode(PyObject *self,
decoded
=
PyUnicode_DecodeUTF8Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
decoded
==
NULL
)
return
NULL
;
return
codec_tuple
(
decoded
,
consumed
);
...
...
@@ -279,7 +279,7 @@ static PyObject *
utf_16_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
byteorder
=
0
;
int
final
=
0
;
...
...
@@ -292,7 +292,7 @@ utf_16_decode(PyObject *self,
consumed
=
pbuf
.
len
;
/* This is overwritten unless final is true. */
decoded
=
PyUnicode_DecodeUTF16Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
&
byteorder
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
decoded
==
NULL
)
return
NULL
;
return
codec_tuple
(
decoded
,
consumed
);
...
...
@@ -302,7 +302,7 @@ static PyObject *
utf_16_le_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
byteorder
=
-
1
;
int
final
=
0
;
...
...
@@ -316,7 +316,7 @@ utf_16_le_decode(PyObject *self,
consumed
=
pbuf
.
len
;
/* This is overwritten unless final is true. */
decoded
=
PyUnicode_DecodeUTF16Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
&
byteorder
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
decoded
==
NULL
)
return
NULL
;
return
codec_tuple
(
decoded
,
consumed
);
...
...
@@ -326,7 +326,7 @@ static PyObject *
utf_16_be_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
byteorder
=
1
;
int
final
=
0
;
...
...
@@ -340,7 +340,7 @@ utf_16_be_decode(PyObject *self,
consumed
=
pbuf
.
len
;
/* This is overwritten unless final is true. */
decoded
=
PyUnicode_DecodeUTF16Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
&
byteorder
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
decoded
==
NULL
)
return
NULL
;
return
codec_tuple
(
decoded
,
consumed
);
...
...
@@ -358,7 +358,7 @@ static PyObject *
utf_16_ex_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
byteorder
=
0
;
PyObject
*
unicode
,
*
tuple
;
...
...
@@ -371,7 +371,7 @@ utf_16_ex_decode(PyObject *self,
consumed
=
pbuf
.
len
;
/* This is overwritten unless final is true. */
unicode
=
PyUnicode_DecodeUTF16Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
&
byteorder
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
unicode
==
NULL
)
return
NULL
;
tuple
=
Py_BuildValue
(
"Oni"
,
unicode
,
consumed
,
byteorder
);
...
...
@@ -383,7 +383,7 @@ static PyObject *
utf_32_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
byteorder
=
0
;
int
final
=
0
;
...
...
@@ -396,7 +396,7 @@ utf_32_decode(PyObject *self,
consumed
=
pbuf
.
len
;
/* This is overwritten unless final is true. */
decoded
=
PyUnicode_DecodeUTF32Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
&
byteorder
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
decoded
==
NULL
)
return
NULL
;
return
codec_tuple
(
decoded
,
consumed
);
...
...
@@ -406,7 +406,7 @@ static PyObject *
utf_32_le_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
byteorder
=
-
1
;
int
final
=
0
;
...
...
@@ -419,7 +419,7 @@ utf_32_le_decode(PyObject *self,
consumed
=
pbuf
.
len
;
/* This is overwritten unless final is true. */
decoded
=
PyUnicode_DecodeUTF32Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
&
byteorder
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
decoded
==
NULL
)
return
NULL
;
return
codec_tuple
(
decoded
,
consumed
);
...
...
@@ -429,7 +429,7 @@ static PyObject *
utf_32_be_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
byteorder
=
1
;
int
final
=
0
;
...
...
@@ -442,7 +442,7 @@ utf_32_be_decode(PyObject *self,
consumed
=
pbuf
.
len
;
/* This is overwritten unless final is true. */
decoded
=
PyUnicode_DecodeUTF32Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
&
byteorder
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
decoded
==
NULL
)
return
NULL
;
return
codec_tuple
(
decoded
,
consumed
);
...
...
@@ -460,7 +460,7 @@ static PyObject *
utf_32_ex_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
byteorder
=
0
;
PyObject
*
unicode
,
*
tuple
;
...
...
@@ -473,7 +473,7 @@ utf_32_ex_decode(PyObject *self,
consumed
=
pbuf
.
len
;
/* This is overwritten unless final is true. */
unicode
=
PyUnicode_DecodeUTF32Stateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
&
byteorder
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
unicode
==
NULL
)
return
NULL
;
tuple
=
Py_BuildValue
(
"Oni"
,
unicode
,
consumed
,
byteorder
);
...
...
@@ -485,7 +485,7 @@ static PyObject *
unicode_escape_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
PyObject
*
unicode
;
...
...
@@ -493,68 +493,68 @@ unicode_escape_decode(PyObject *self,
&
pbuf
,
&
errors
))
return
NULL
;
unicode
=
PyUnicode_DecodeUnicodeEscape
(
pbuf
.
buf
,
pbuf
.
len
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
unicode
=
PyUnicode_DecodeUnicodeEscape
(
pbuf
.
buf
,
pbuf
.
len
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
}
static
PyObject
*
raw_unicode_escape_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
PyObject
*
unicode
;
PyObject
*
unicode
;
if
(
!
PyArg_ParseTuple
(
args
,
"s*|z:raw_unicode_escape_decode"
,
&
pbuf
,
&
errors
))
return
NULL
;
unicode
=
PyUnicode_DecodeRawUnicodeEscape
(
pbuf
.
buf
,
pbuf
.
len
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
unicode
=
PyUnicode_DecodeRawUnicodeEscape
(
pbuf
.
buf
,
pbuf
.
len
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
}
static
PyObject
*
latin_1_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
PyObject
*
unicode
;
Py_buffer
pbuf
;
PyObject
*
unicode
;
const
char
*
errors
=
NULL
;
if
(
!
PyArg_ParseTuple
(
args
,
"s*|z:latin_1_decode"
,
&
pbuf
,
&
errors
))
return
NULL
;
unicode
=
PyUnicode_DecodeLatin1
(
pbuf
.
buf
,
pbuf
.
len
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
unicode
=
PyUnicode_DecodeLatin1
(
pbuf
.
buf
,
pbuf
.
len
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
}
static
PyObject
*
ascii_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
PyObject
*
unicode
;
Py_buffer
pbuf
;
PyObject
*
unicode
;
const
char
*
errors
=
NULL
;
if
(
!
PyArg_ParseTuple
(
args
,
"s*|z:ascii_decode"
,
&
pbuf
,
&
errors
))
return
NULL
;
unicode
=
PyUnicode_DecodeASCII
(
pbuf
.
buf
,
pbuf
.
len
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
unicode
=
PyUnicode_DecodeASCII
(
pbuf
.
buf
,
pbuf
.
len
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
}
static
PyObject
*
charmap_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
PyObject
*
unicode
;
Py_buffer
pbuf
;
PyObject
*
unicode
;
const
char
*
errors
=
NULL
;
PyObject
*
mapping
=
NULL
;
...
...
@@ -564,9 +564,9 @@ charmap_decode(PyObject *self,
if
(
mapping
==
Py_None
)
mapping
=
NULL
;
unicode
=
PyUnicode_DecodeCharmap
(
pbuf
.
buf
,
pbuf
.
len
,
mapping
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
unicode
=
PyUnicode_DecodeCharmap
(
pbuf
.
buf
,
pbuf
.
len
,
mapping
,
errors
);
PyBuffer_Release
(
&
pbuf
);
return
codec_tuple
(
unicode
,
pbuf
.
len
);
}
#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
...
...
@@ -575,7 +575,7 @@ static PyObject *
mbcs_decode
(
PyObject
*
self
,
PyObject
*
args
)
{
Py_buffer
pbuf
;
Py_buffer
pbuf
;
const
char
*
errors
=
NULL
;
int
final
=
0
;
Py_ssize_t
consumed
;
...
...
@@ -588,7 +588,7 @@ mbcs_decode(PyObject *self,
decoded
=
PyUnicode_DecodeMBCSStateful
(
pbuf
.
buf
,
pbuf
.
len
,
errors
,
final
?
NULL
:
&
consumed
);
PyBuffer_Release
(
&
pbuf
);
PyBuffer_Release
(
&
pbuf
);
if
(
decoded
==
NULL
)
return
NULL
;
return
codec_tuple
(
decoded
,
consumed
);
...
...
Objects/bytearrayobject.c
Dosyayı görüntüle @
619f16e1
...
...
@@ -106,24 +106,24 @@ bytearray_buffer_getcharbuf(PyByteArrayObject *self, Py_ssize_t index, const cha
static
int
bytearray_getbuffer
(
PyByteArrayObject
*
obj
,
Py_buffer
*
view
,
int
flags
)
{
int
ret
;
void
*
ptr
;
if
(
view
==
NULL
)
{
obj
->
ob_exports
++
;
return
0
;
}
ptr
=
(
void
*
)
PyByteArray_AS_STRING
(
obj
);
ret
=
PyBuffer_FillInfo
(
view
,
(
PyObject
*
)
obj
,
ptr
,
Py_SIZE
(
obj
),
0
,
flags
);
if
(
ret
>=
0
)
{
obj
->
ob_exports
++
;
}
return
ret
;
int
ret
;
void
*
ptr
;
if
(
view
==
NULL
)
{
obj
->
ob_exports
++
;
return
0
;
}
ptr
=
(
void
*
)
PyByteArray_AS_STRING
(
obj
);
ret
=
PyBuffer_FillInfo
(
view
,
(
PyObject
*
)
obj
,
ptr
,
Py_SIZE
(
obj
),
0
,
flags
);
if
(
ret
>=
0
)
{
obj
->
ob_exports
++
;
}
return
ret
;
}
static
void
bytearray_releasebuffer
(
PyByteArrayObject
*
obj
,
Py_buffer
*
view
)
{
obj
->
ob_exports
--
;
obj
->
ob_exports
--
;
}
static
Py_ssize_t
...
...
@@ -1718,43 +1718,43 @@ replace_single_character_in_place(PyByteArrayObject *self,
char
from_c
,
char
to_c
,
Py_ssize_t
maxcount
)
{
char
*
self_s
,
*
result_s
,
*
start
,
*
end
,
*
next
;
Py_ssize_t
self_len
;
PyByteArrayObject
*
result
;
char
*
self_s
,
*
result_s
,
*
start
,
*
end
,
*
next
;
Py_ssize_t
self_len
;
PyByteArrayObject
*
result
;
/* The result string will be the same size */
self_s
=
PyByteArray_AS_STRING
(
self
);
self_len
=
PyByteArray_GET_SIZE
(
self
);
/* The result string will be the same size */
self_s
=
PyByteArray_AS_STRING
(
self
);
self_len
=
PyByteArray_GET_SIZE
(
self
);
next
=
findchar
(
self_s
,
self_len
,
from_c
);
next
=
findchar
(
self_s
,
self_len
,
from_c
);
if
(
next
==
NULL
)
{
/* No matches; return the original bytes */
return
return_self
(
self
);
}
if
(
next
==
NULL
)
{
/* No matches; return the original bytes */
return
return_self
(
self
);
}
/* Need to make a new bytes */
result
=
(
PyByteArrayObject
*
)
PyByteArray_FromStringAndSize
(
NULL
,
self_len
);
if
(
result
==
NULL
)
return
NULL
;
result_s
=
PyByteArray_AS_STRING
(
result
);
Py_MEMCPY
(
result_s
,
self_s
,
self_len
);
/* change everything in-place, starting with this one */
start
=
result_s
+
(
next
-
self_s
);
*
start
=
to_c
;
start
++
;
end
=
result_s
+
self_len
;
while
(
--
maxcount
>
0
)
{
next
=
findchar
(
start
,
end
-
start
,
from_c
);
if
(
next
==
NULL
)
break
;
*
next
=
to_c
;
start
=
next
+
1
;
}
/* Need to make a new bytes */
result
=
(
PyByteArrayObject
*
)
PyByteArray_FromStringAndSize
(
NULL
,
self_len
);
if
(
result
==
NULL
)
return
NULL
;
result_s
=
PyByteArray_AS_STRING
(
result
);
Py_MEMCPY
(
result_s
,
self_s
,
self_len
);
/* change everything in-place, starting with this one */
start
=
result_s
+
(
next
-
self_s
);
*
start
=
to_c
;
start
++
;
end
=
result_s
+
self_len
;
return
result
;
while
(
--
maxcount
>
0
)
{
next
=
findchar
(
start
,
end
-
start
,
from_c
);
if
(
next
==
NULL
)
break
;
*
next
=
to_c
;
start
=
next
+
1
;
}
return
result
;
}
/* len(self)>=1, len(from)==len(to)>=2, maxcount>=1 */
...
...
Objects/stringobject.c
Dosyayı görüntüle @
619f16e1
...
...
@@ -426,7 +426,7 @@ PyObject *PyString_Decode(const char *s,
str
=
PyString_FromStringAndSize
(
s
,
size
);
if
(
str
==
NULL
)
return
NULL
;
return
NULL
;
v
=
PyString_AsDecodedString
(
str
,
encoding
,
errors
);
Py_DECREF
(
str
);
return
v
;
...
...
@@ -439,23 +439,23 @@ PyObject *PyString_AsDecodedObject(PyObject *str,
PyObject
*
v
;
if
(
!
PyString_Check
(
str
))
{
PyErr_BadArgument
();
goto
onError
;
PyErr_BadArgument
();
goto
onError
;
}
if
(
encoding
==
NULL
)
{
#ifdef Py_USING_UNICODE
encoding
=
PyUnicode_GetDefaultEncoding
();
encoding
=
PyUnicode_GetDefaultEncoding
();
#else
PyErr_SetString
(
PyExc_ValueError
,
"no encoding specified"
);
goto
onError
;
PyErr_SetString
(
PyExc_ValueError
,
"no encoding specified"
);
goto
onError
;
#endif
}
/* Decode via the codec registry */
v
=
PyCodec_Decode
(
str
,
encoding
,
errors
);
if
(
v
==
NULL
)
goto
onError
;
goto
onError
;
return
v
;
...
...
@@ -471,24 +471,24 @@ PyObject *PyString_AsDecodedString(PyObject *str,
v
=
PyString_AsDecodedObject
(
str
,
encoding
,
errors
);
if
(
v
==
NULL
)
goto
onError
;
goto
onError
;
#ifdef Py_USING_UNICODE
/* Convert Unicode to a string using the default encoding */
if
(
PyUnicode_Check
(
v
))
{
PyObject
*
temp
=
v
;
v
=
PyUnicode_AsEncodedString
(
v
,
NULL
,
NULL
);
Py_DECREF
(
temp
);
if
(
v
==
NULL
)
goto
onError
;
PyObject
*
temp
=
v
;
v
=
PyUnicode_AsEncodedString
(
v
,
NULL
,
NULL
);
Py_DECREF
(
temp
);
if
(
v
==
NULL
)
goto
onError
;
}
#endif
if
(
!
PyString_Check
(
v
))
{
PyErr_Format
(
PyExc_TypeError
,
"decoder did not return a string object (type=%.400s)"
,
Py_TYPE
(
v
)
->
tp_name
);
Py_DECREF
(
v
);
goto
onError
;
PyErr_Format
(
PyExc_TypeError
,
"decoder did not return a string object (type=%.400s)"
,
Py_TYPE
(
v
)
->
tp_name
);
Py_DECREF
(
v
);
goto
onError
;
}
return
v
;
...
...
@@ -506,7 +506,7 @@ PyObject *PyString_Encode(const char *s,
str
=
PyString_FromStringAndSize
(
s
,
size
);
if
(
str
==
NULL
)
return
NULL
;
return
NULL
;
v
=
PyString_AsEncodedString
(
str
,
encoding
,
errors
);
Py_DECREF
(
str
);
return
v
;
...
...
@@ -519,23 +519,23 @@ PyObject *PyString_AsEncodedObject(PyObject *str,
PyObject
*
v
;
if
(
!
PyString_Check
(
str
))
{
PyErr_BadArgument
();
goto
onError
;
PyErr_BadArgument
();
goto
onError
;
}
if
(
encoding
==
NULL
)
{
#ifdef Py_USING_UNICODE
encoding
=
PyUnicode_GetDefaultEncoding
();
encoding
=
PyUnicode_GetDefaultEncoding
();
#else
PyErr_SetString
(
PyExc_ValueError
,
"no encoding specified"
);
goto
onError
;
PyErr_SetString
(
PyExc_ValueError
,
"no encoding specified"
);
goto
onError
;
#endif
}
/* Encode via the codec registry */
v
=
PyCodec_Encode
(
str
,
encoding
,
errors
);
if
(
v
==
NULL
)
goto
onError
;
goto
onError
;
return
v
;
...
...
@@ -551,24 +551,24 @@ PyObject *PyString_AsEncodedString(PyObject *str,
v
=
PyString_AsEncodedObject
(
str
,
encoding
,
errors
);
if
(
v
==
NULL
)
goto
onError
;
goto
onError
;
#ifdef Py_USING_UNICODE
/* Convert Unicode to a string using the default encoding */
if
(
PyUnicode_Check
(
v
))
{
PyObject
*
temp
=
v
;
v
=
PyUnicode_AsEncodedString
(
v
,
NULL
,
NULL
);
Py_DECREF
(
temp
);
if
(
v
==
NULL
)
goto
onError
;
PyObject
*
temp
=
v
;
v
=
PyUnicode_AsEncodedString
(
v
,
NULL
,
NULL
);
Py_DECREF
(
temp
);
if
(
v
==
NULL
)
goto
onError
;
}
#endif
if
(
!
PyString_Check
(
v
))
{
PyErr_Format
(
PyExc_TypeError
,
"encoder did not return a string object (type=%.400s)"
,
Py_TYPE
(
v
)
->
tp_name
);
Py_DECREF
(
v
);
goto
onError
;
PyErr_Format
(
PyExc_TypeError
,
"encoder did not return a string object (type=%.400s)"
,
Py_TYPE
(
v
)
->
tp_name
);
Py_DECREF
(
v
);
goto
onError
;
}
return
v
;
...
...
@@ -3002,17 +3002,17 @@ string_encode(PyStringObject *self, PyObject *args, PyObject *kwargs)
if
(
!
PyArg_ParseTupleAndKeywords
(
args
,
kwargs
,
"|ss:encode"
,
kwlist
,
&
encoding
,
&
errors
))
return
NULL
;
return
NULL
;
v
=
PyString_AsEncodedObject
((
PyObject
*
)
self
,
encoding
,
errors
);
if
(
v
==
NULL
)
goto
onError
;
goto
onError
;
if
(
!
PyString_Check
(
v
)
&&
!
PyUnicode_Check
(
v
))
{
PyErr_Format
(
PyExc_TypeError
,
"encoder did not return a string/unicode object "
"(type=%.400s)"
,
Py_TYPE
(
v
)
->
tp_name
);
Py_DECREF
(
v
);
return
NULL
;
PyErr_Format
(
PyExc_TypeError
,
"encoder did not return a string/unicode object "
"(type=%.400s)"
,
Py_TYPE
(
v
)
->
tp_name
);
Py_DECREF
(
v
);
return
NULL
;
}
return
v
;
...
...
@@ -3041,17 +3041,17 @@ string_decode(PyStringObject *self, PyObject *args, PyObject *kwargs)
if
(
!
PyArg_ParseTupleAndKeywords
(
args
,
kwargs
,
"|ss:decode"
,
kwlist
,
&
encoding
,
&
errors
))
return
NULL
;
return
NULL
;
v
=
PyString_AsDecodedObject
((
PyObject
*
)
self
,
encoding
,
errors
);
if
(
v
==
NULL
)
goto
onError
;
goto
onError
;
if
(
!
PyString_Check
(
v
)
&&
!
PyUnicode_Check
(
v
))
{
PyErr_Format
(
PyExc_TypeError
,
"decoder did not return a string/unicode object "
"(type=%.400s)"
,
Py_TYPE
(
v
)
->
tp_name
);
Py_DECREF
(
v
);
return
NULL
;
PyErr_Format
(
PyExc_TypeError
,
"decoder did not return a string/unicode object "
"(type=%.400s)"
,
Py_TYPE
(
v
)
->
tp_name
);
Py_DECREF
(
v
);
return
NULL
;
}
return
v
;
...
...
@@ -3076,7 +3076,7 @@ string_expandtabs(PyStringObject *self, PyObject *args)
int
tabsize
=
8
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i:expandtabs"
,
&
tabsize
))
return
NULL
;
return
NULL
;
/* First pass: determine size of output string */
i
=
0
;
/* chars up to and including most recent \n or \r */
...
...
@@ -3085,31 +3085,31 @@ string_expandtabs(PyStringObject *self, PyObject *args)
for
(
p
=
PyString_AS_STRING
(
self
);
p
<
e
;
p
++
)
if
(
*
p
==
'\t'
)
{
if
(
tabsize
>
0
)
{
incr
=
tabsize
-
(
j
%
tabsize
);
if
(
j
>
PY_SSIZE_T_MAX
-
incr
)
goto
overflow1
;
j
+=
incr
;
incr
=
tabsize
-
(
j
%
tabsize
);
if
(
j
>
PY_SSIZE_T_MAX
-
incr
)
goto
overflow1
;
j
+=
incr
;
}
}
else
{
if
(
j
>
PY_SSIZE_T_MAX
-
1
)
goto
overflow1
;
goto
overflow1
;
j
++
;
if
(
*
p
==
'\n'
||
*
p
==
'\r'
)
{
if
(
i
>
PY_SSIZE_T_MAX
-
j
)
goto
overflow1
;
i
+=
j
;
j
=
0
;
if
(
i
>
PY_SSIZE_T_MAX
-
j
)
goto
overflow1
;
i
+=
j
;
j
=
0
;
}
}
if
(
i
>
PY_SSIZE_T_MAX
-
j
)
goto
overflow1
;
goto
overflow1
;
/* Second pass: create output string and fill it */
u
=
PyString_FromStringAndSize
(
NULL
,
i
+
j
);
if
(
!
u
)
return
NULL
;
return
NULL
;
j
=
0
;
/* same as in first pass */
q
=
PyString_AS_STRING
(
u
);
/* next output char */
...
...
@@ -3118,22 +3118,22 @@ string_expandtabs(PyStringObject *self, PyObject *args)
for
(
p
=
PyString_AS_STRING
(
self
);
p
<
e
;
p
++
)
if
(
*
p
==
'\t'
)
{
if
(
tabsize
>
0
)
{
i
=
tabsize
-
(
j
%
tabsize
);
j
+=
i
;
while
(
i
--
)
{
if
(
q
>=
qe
)
goto
overflow2
;
*
q
++
=
' '
;
}
i
=
tabsize
-
(
j
%
tabsize
);
j
+=
i
;
while
(
i
--
)
{
if
(
q
>=
qe
)
goto
overflow2
;
*
q
++
=
' '
;
}
}
}
else
{
if
(
q
>=
qe
)
goto
overflow2
;
goto
overflow2
;
*
q
++
=
*
p
;
j
++
;
if
(
*
p
==
'\n'
||
*
p
==
'\r'
)
j
=
0
;
j
=
0
;
}
return
u
;
...
...
@@ -3151,26 +3151,26 @@ pad(PyStringObject *self, Py_ssize_t left, Py_ssize_t right, char fill)
PyObject
*
u
;
if
(
left
<
0
)
left
=
0
;
left
=
0
;
if
(
right
<
0
)
right
=
0
;
right
=
0
;
if
(
left
==
0
&&
right
==
0
&&
PyString_CheckExact
(
self
))
{
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
}
u
=
PyString_FromStringAndSize
(
NULL
,
left
+
PyString_GET_SIZE
(
self
)
+
right
);
if
(
u
)
{
if
(
left
)
memset
(
PyString_AS_STRING
(
u
),
fill
,
left
);
Py_MEMCPY
(
PyString_AS_STRING
(
u
)
+
left
,
PyString_AS_STRING
(
self
),
PyString_GET_SIZE
(
self
));
if
(
right
)
memset
(
PyString_AS_STRING
(
u
)
+
left
+
PyString_GET_SIZE
(
self
),
fill
,
right
);
if
(
left
)
memset
(
PyString_AS_STRING
(
u
),
fill
,
left
);
Py_MEMCPY
(
PyString_AS_STRING
(
u
)
+
left
,
PyString_AS_STRING
(
self
),
PyString_GET_SIZE
(
self
));
if
(
right
)
memset
(
PyString_AS_STRING
(
u
)
+
left
+
PyString_GET_SIZE
(
self
),
fill
,
right
);
}
return
u
;
...
...
@@ -3189,11 +3189,11 @@ string_ljust(PyStringObject *self, PyObject *args)
char
fillchar
=
' '
;
if
(
!
PyArg_ParseTuple
(
args
,
"n|c:ljust"
,
&
width
,
&
fillchar
))
return
NULL
;
return
NULL
;
if
(
PyString_GET_SIZE
(
self
)
>=
width
&&
PyString_CheckExact
(
self
))
{
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
}
return
pad
(
self
,
0
,
width
-
PyString_GET_SIZE
(
self
),
fillchar
);
...
...
@@ -3213,11 +3213,11 @@ string_rjust(PyStringObject *self, PyObject *args)
char
fillchar
=
' '
;
if
(
!
PyArg_ParseTuple
(
args
,
"n|c:rjust"
,
&
width
,
&
fillchar
))
return
NULL
;
return
NULL
;
if
(
PyString_GET_SIZE
(
self
)
>=
width
&&
PyString_CheckExact
(
self
))
{
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
}
return
pad
(
self
,
width
-
PyString_GET_SIZE
(
self
),
0
,
fillchar
);
...
...
@@ -3238,11 +3238,11 @@ string_center(PyStringObject *self, PyObject *args)
char
fillchar
=
' '
;
if
(
!
PyArg_ParseTuple
(
args
,
"n|c:center"
,
&
width
,
&
fillchar
))
return
NULL
;
return
NULL
;
if
(
PyString_GET_SIZE
(
self
)
>=
width
&&
PyString_CheckExact
(
self
))
{
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
}
marg
=
width
-
PyString_GET_SIZE
(
self
);
...
...
@@ -3266,18 +3266,18 @@ string_zfill(PyStringObject *self, PyObject *args)
Py_ssize_t
width
;
if
(
!
PyArg_ParseTuple
(
args
,
"n:zfill"
,
&
width
))
return
NULL
;
return
NULL
;
if
(
PyString_GET_SIZE
(
self
)
>=
width
)
{
if
(
PyString_CheckExact
(
self
))
{
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
}
else
return
PyString_FromStringAndSize
(
PyString_AS_STRING
(
self
),
PyString_GET_SIZE
(
self
)
);
if
(
PyString_CheckExact
(
self
))
{
Py_INCREF
(
self
);
return
(
PyObject
*
)
self
;
}
else
return
PyString_FromStringAndSize
(
PyString_AS_STRING
(
self
),
PyString_GET_SIZE
(
self
)
);
}
fill
=
width
-
PyString_GET_SIZE
(
self
);
...
...
@@ -3285,13 +3285,13 @@ string_zfill(PyStringObject *self, PyObject *args)
s
=
pad
(
self
,
fill
,
0
,
'0'
);
if
(
s
==
NULL
)
return
NULL
;
return
NULL
;
p
=
PyString_AS_STRING
(
s
);
if
(
p
[
fill
]
==
'+'
||
p
[
fill
]
==
'-'
)
{
/* move sign to beginning of string */
p
[
0
]
=
p
[
fill
];
p
[
fill
]
=
'0'
;
/* move sign to beginning of string */
p
[
0
]
=
p
[
fill
];
p
[
fill
]
=
'0'
;
}
return
(
PyObject
*
)
s
;
...
...
@@ -3307,22 +3307,22 @@ static PyObject*
string_isspace
(
PyStringObject
*
self
)
{
register
const
unsigned
char
*
p
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
register
const
unsigned
char
*
e
;
/* Shortcut for single character strings */
if
(
PyString_GET_SIZE
(
self
)
==
1
&&
isspace
(
*
p
))
return
PyBool_FromLong
(
1
);
isspace
(
*
p
))
return
PyBool_FromLong
(
1
);
/* Special case for empty strings */
if
(
PyString_GET_SIZE
(
self
)
==
0
)
return
PyBool_FromLong
(
0
);
return
PyBool_FromLong
(
0
);
e
=
p
+
PyString_GET_SIZE
(
self
);
for
(;
p
<
e
;
p
++
)
{
if
(
!
isspace
(
*
p
))
return
PyBool_FromLong
(
0
);
if
(
!
isspace
(
*
p
))
return
PyBool_FromLong
(
0
);
}
return
PyBool_FromLong
(
1
);
}
...
...
@@ -3338,22 +3338,22 @@ static PyObject*
string_isalpha
(
PyStringObject
*
self
)
{
register
const
unsigned
char
*
p
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
register
const
unsigned
char
*
e
;
/* Shortcut for single character strings */
if
(
PyString_GET_SIZE
(
self
)
==
1
&&
isalpha
(
*
p
))
return
PyBool_FromLong
(
1
);
isalpha
(
*
p
))
return
PyBool_FromLong
(
1
);
/* Special case for empty strings */
if
(
PyString_GET_SIZE
(
self
)
==
0
)
return
PyBool_FromLong
(
0
);
return
PyBool_FromLong
(
0
);
e
=
p
+
PyString_GET_SIZE
(
self
);
for
(;
p
<
e
;
p
++
)
{
if
(
!
isalpha
(
*
p
))
return
PyBool_FromLong
(
0
);
if
(
!
isalpha
(
*
p
))
return
PyBool_FromLong
(
0
);
}
return
PyBool_FromLong
(
1
);
}
...
...
@@ -3369,22 +3369,22 @@ static PyObject*
string_isalnum
(
PyStringObject
*
self
)
{
register
const
unsigned
char
*
p
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
register
const
unsigned
char
*
e
;
/* Shortcut for single character strings */
if
(
PyString_GET_SIZE
(
self
)
==
1
&&
isalnum
(
*
p
))
return
PyBool_FromLong
(
1
);
isalnum
(
*
p
))
return
PyBool_FromLong
(
1
);
/* Special case for empty strings */
if
(
PyString_GET_SIZE
(
self
)
==
0
)
return
PyBool_FromLong
(
0
);
return
PyBool_FromLong
(
0
);
e
=
p
+
PyString_GET_SIZE
(
self
);
for
(;
p
<
e
;
p
++
)
{
if
(
!
isalnum
(
*
p
))
return
PyBool_FromLong
(
0
);
if
(
!
isalnum
(
*
p
))
return
PyBool_FromLong
(
0
);
}
return
PyBool_FromLong
(
1
);
}
...
...
@@ -3400,22 +3400,22 @@ static PyObject*
string_isdigit
(
PyStringObject
*
self
)
{
register
const
unsigned
char
*
p
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
register
const
unsigned
char
*
e
;
/* Shortcut for single character strings */
if
(
PyString_GET_SIZE
(
self
)
==
1
&&
isdigit
(
*
p
))
return
PyBool_FromLong
(
1
);
isdigit
(
*
p
))
return
PyBool_FromLong
(
1
);
/* Special case for empty strings */
if
(
PyString_GET_SIZE
(
self
)
==
0
)
return
PyBool_FromLong
(
0
);
return
PyBool_FromLong
(
0
);
e
=
p
+
PyString_GET_SIZE
(
self
);
for
(;
p
<
e
;
p
++
)
{
if
(
!
isdigit
(
*
p
))
return
PyBool_FromLong
(
0
);
if
(
!
isdigit
(
*
p
))
return
PyBool_FromLong
(
0
);
}
return
PyBool_FromLong
(
1
);
}
...
...
@@ -3431,25 +3431,25 @@ static PyObject*
string_islower
(
PyStringObject
*
self
)
{
register
const
unsigned
char
*
p
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
register
const
unsigned
char
*
e
;
int
cased
;
/* Shortcut for single character strings */
if
(
PyString_GET_SIZE
(
self
)
==
1
)
return
PyBool_FromLong
(
islower
(
*
p
)
!=
0
);
return
PyBool_FromLong
(
islower
(
*
p
)
!=
0
);
/* Special case for empty strings */
if
(
PyString_GET_SIZE
(
self
)
==
0
)
return
PyBool_FromLong
(
0
);
return
PyBool_FromLong
(
0
);
e
=
p
+
PyString_GET_SIZE
(
self
);
cased
=
0
;
for
(;
p
<
e
;
p
++
)
{
if
(
isupper
(
*
p
))
return
PyBool_FromLong
(
0
);
else
if
(
!
cased
&&
islower
(
*
p
))
cased
=
1
;
if
(
isupper
(
*
p
))
return
PyBool_FromLong
(
0
);
else
if
(
!
cased
&&
islower
(
*
p
))
cased
=
1
;
}
return
PyBool_FromLong
(
cased
);
}
...
...
@@ -3465,25 +3465,25 @@ static PyObject*
string_isupper
(
PyStringObject
*
self
)
{
register
const
unsigned
char
*
p
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
register
const
unsigned
char
*
e
;
int
cased
;
/* Shortcut for single character strings */
if
(
PyString_GET_SIZE
(
self
)
==
1
)
return
PyBool_FromLong
(
isupper
(
*
p
)
!=
0
);
return
PyBool_FromLong
(
isupper
(
*
p
)
!=
0
);
/* Special case for empty strings */
if
(
PyString_GET_SIZE
(
self
)
==
0
)
return
PyBool_FromLong
(
0
);
return
PyBool_FromLong
(
0
);
e
=
p
+
PyString_GET_SIZE
(
self
);
cased
=
0
;
for
(;
p
<
e
;
p
++
)
{
if
(
islower
(
*
p
))
return
PyBool_FromLong
(
0
);
else
if
(
!
cased
&&
isupper
(
*
p
))
cased
=
1
;
if
(
islower
(
*
p
))
return
PyBool_FromLong
(
0
);
else
if
(
!
cased
&&
isupper
(
*
p
))
cased
=
1
;
}
return
PyBool_FromLong
(
cased
);
}
...
...
@@ -3501,38 +3501,38 @@ static PyObject*
string_istitle
(
PyStringObject
*
self
,
PyObject
*
uncased
)
{
register
const
unsigned
char
*
p
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
=
(
unsigned
char
*
)
PyString_AS_STRING
(
self
);
register
const
unsigned
char
*
e
;
int
cased
,
previous_is_cased
;
/* Shortcut for single character strings */
if
(
PyString_GET_SIZE
(
self
)
==
1
)
return
PyBool_FromLong
(
isupper
(
*
p
)
!=
0
);
return
PyBool_FromLong
(
isupper
(
*
p
)
!=
0
);
/* Special case for empty strings */
if
(
PyString_GET_SIZE
(
self
)
==
0
)
return
PyBool_FromLong
(
0
);
return
PyBool_FromLong
(
0
);
e
=
p
+
PyString_GET_SIZE
(
self
);
cased
=
0
;
previous_is_cased
=
0
;
for
(;
p
<
e
;
p
++
)
{
register
const
unsigned
char
ch
=
*
p
;
register
const
unsigned
char
ch
=
*
p
;
if
(
isupper
(
ch
))
{
if
(
previous_is_cased
)
return
PyBool_FromLong
(
0
);
previous_is_cased
=
1
;
cased
=
1
;
}
else
if
(
islower
(
ch
))
{
if
(
!
previous_is_cased
)
return
PyBool_FromLong
(
0
);
previous_is_cased
=
1
;
cased
=
1
;
}
else
previous_is_cased
=
0
;
if
(
isupper
(
ch
))
{
if
(
previous_is_cased
)
return
PyBool_FromLong
(
0
);
previous_is_cased
=
1
;
cased
=
1
;
}
else
if
(
islower
(
ch
))
{
if
(
!
previous_is_cased
)
return
PyBool_FromLong
(
0
);
previous_is_cased
=
1
;
cased
=
1
;
}
else
previous_is_cased
=
0
;
}
return
PyBool_FromLong
(
cased
);
}
...
...
@@ -3551,11 +3551,11 @@ string_splitlines(PyStringObject *self, PyObject *args)
int
keepends
=
0
;
if
(
!
PyArg_ParseTuple
(
args
,
"|i:splitlines"
,
&
keepends
))
return
NULL
;
return
NULL
;
return
stringlib_splitlines
(
(
PyObject
*
)
self
,
PyString_AS_STRING
(
self
),
PyString_GET_SIZE
(
self
),
keepends
(
PyObject
*
)
self
,
PyString_AS_STRING
(
self
),
PyString_GET_SIZE
(
self
),
keepends
);
}
...
...
@@ -3594,15 +3594,15 @@ string__format__(PyObject* self, PyObject* args)
/* If 2.x, convert format_spec to the same type as value */
/* This is to allow things like u''.format('') */
if
(
!
PyArg_ParseTuple
(
args
,
"O:__format__"
,
&
format_spec
))
goto
done
;
goto
done
;
if
(
!
(
PyString_Check
(
format_spec
)
||
PyUnicode_Check
(
format_spec
)))
{
PyErr_Format
(
PyExc_TypeError
,
"__format__ arg must be str "
"or unicode, not %s"
,
Py_TYPE
(
format_spec
)
->
tp_name
);
goto
done
;
PyErr_Format
(
PyExc_TypeError
,
"__format__ arg must be str "
"or unicode, not %s"
,
Py_TYPE
(
format_spec
)
->
tp_name
);
goto
done
;
}
tmp
=
PyObject_Str
(
format_spec
);
if
(
tmp
==
NULL
)
goto
done
;
goto
done
;
format_spec
=
tmp
;
result
=
_PyBytes_FormatAdvanced
(
self
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment