From afcbccb9b5489c88d96edf4d3f851eaa35872852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 13:39:20 +0200 Subject: [PATCH 001/136] Codycam: some 64 bit fixes --- src/apps/codycam/CodyCam.cpp | 4 ++-- src/apps/codycam/Settings.cpp | 2 +- src/apps/codycam/Settings.h | 2 +- src/apps/codycam/VideoConsumer.cpp | 17 +++++++++-------- src/apps/codycam/VideoConsumer.h | 6 +++--- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/apps/codycam/CodyCam.cpp b/src/apps/codycam/CodyCam.cpp index 36f17d4bac..f68df37330 100644 --- a/src/apps/codycam/CodyCam.cpp +++ b/src/apps/codycam/CodyCam.cpp @@ -65,7 +65,7 @@ ErrorAlert(const char* message, status_t err, BWindow *window = NULL) alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); - printf("%s\n%s [%lx]", message, strerror(err), err); + printf("%s\n%s [%" B_PRIx32 "]", message, strerror(err), err); } @@ -541,7 +541,7 @@ VideoWindow::MessageReceived(BMessage* message) case msg_upl_client: message->FindInt32("client", &(fFtpInfo.uploadClient)); - FTPINFO("upl client = %ld\n", fFtpInfo.uploadClient); + FTPINFO("upl client = %" B_PRId32 "\n", fFtpInfo.uploadClient); _UploadClientChanged(); break; diff --git a/src/apps/codycam/Settings.cpp b/src/apps/codycam/Settings.cpp index af06871438..537d0bf1f9 100644 --- a/src/apps/codycam/Settings.cpp +++ b/src/apps/codycam/Settings.cpp @@ -177,7 +177,7 @@ ScalarValueSetting::Value() const void ScalarValueSetting::GetValueAsString(char* buffer) const { - sprintf(buffer, "%ld", fValue); + sprintf(buffer, "%" B_PRId32, fValue); } diff --git a/src/apps/codycam/Settings.h b/src/apps/codycam/Settings.h index 7bce95515a..cde0f821ba 100644 --- a/src/apps/codycam/Settings.h +++ b/src/apps/codycam/Settings.h @@ -61,7 +61,7 @@ public: int32 defaultValue, const char* valueExpectedErrorString, const char* wrongValueErrorString, - int32 min = LONG_MIN, int32 max = LONG_MAX); + int32 min = INT32_MIN, int32 max = INT32_MAX); virtual ~ScalarValueSetting(); void ValueChanged(int32 newValue); diff --git a/src/apps/codycam/VideoConsumer.cpp b/src/apps/codycam/VideoConsumer.cpp index c764d19c7c..55618e0972 100644 --- a/src/apps/codycam/VideoConsumer.cpp +++ b/src/apps/codycam/VideoConsumer.cpp @@ -124,7 +124,7 @@ VideoConsumer::~VideoConsumer() BMediaAddOn* -VideoConsumer::AddOn(long* cookie) const +VideoConsumer::AddOn(int32* cookie) const { FUNCTION("VideoConsumer::AddOn\n"); // do the right thing if we're ever used with an add-on @@ -243,7 +243,8 @@ VideoConsumer::HandleMessage(int32 message, const void* data, size_t size) void VideoConsumer::BufferReceived(BBuffer* buffer) { - LOOP("VideoConsumer::Buffer #%ld received, start_time %Ld\n", buffer->ID(), buffer->Header()->start_time); + LOOP("VideoConsumer::Buffer #%" B_PRId32 " received, start_time %" B_PRIdBIGTIME + "\n", buffer->ID(), buffer->Header()->start_time); if (RunState() == B_STOPPED) { buffer->Recycle(); @@ -309,8 +310,8 @@ VideoConsumer::CreateBuffers(const media_format& withFormat) else PROGRESS("VideoConsumer::CreateBuffers - SUCCESSFUL ADD BUFFER TO GROUP\n"); } else { - ERROR("VideoConsumer::CreateBuffers - ERROR CREATING VIDEO RING BUFFER: %08lx\n", - status); + ERROR("VideoConsumer::CreateBuffers - ERROR CREATING VIDEO RING " + "BUFFER: %08" B_PRIx32 "\n", status); return B_ERROR; } } @@ -322,8 +323,8 @@ VideoConsumer::CreateBuffers(const media_format& withFormat) if ((status = fBuffers->GetBufferList(3, buffList)) == B_OK) for (int j = 0; j < 3; j++) if (buffList[j] != NULL) { - fBufferMap[j] = (uint32)buffList[j]; - PROGRESS(" j = %d buffer = %08lx\n", j, fBufferMap[j]); + fBufferMap[j] = buffList[j]; + PROGRESS(" j = %d buffer = %p\n", j, fBufferMap[j]); } else { ERROR("VideoConsumer::CreateBuffers ERROR MAPPING RING BUFFER\n"); return B_ERROR; @@ -542,7 +543,7 @@ VideoConsumer::HandleEvent(const media_timed_event* event, bigtime_t lateness, uint32 index = 0; fOurBuffers = true; while (index < 3) - if ((uint32)buffer == fBufferMap[index]) + if (buffer == fBufferMap[index]) break; else index++; @@ -735,7 +736,7 @@ VideoConsumer::FtpSave(char* filename) uint32 time = real_time_clock(); char s[80]; strcpy(s, B_TRANSLATE("Last Capture: ")); - strcat(s, ctime((const long*)&time)); + strcat(s, ctime((const time_t*)&time)); s[strlen(s) - 1] = 0; UpdateFtpStatus(s); delete ftp; diff --git a/src/apps/codycam/VideoConsumer.h b/src/apps/codycam/VideoConsumer.h index 473bd4f069..af3e640a47 100644 --- a/src/apps/codycam/VideoConsumer.h +++ b/src/apps/codycam/VideoConsumer.h @@ -43,7 +43,7 @@ class VideoConsumer : public BMediaEventLooper, public BBufferConsumer { /* BMediaNode */ public: - virtual BMediaAddOn* AddOn(long* cookie) const; + virtual BMediaAddOn* AddOn(int32* cookie) const; protected: virtual void Start(bigtime_t performanceTime); @@ -114,7 +114,7 @@ class VideoConsumer : public BMediaEventLooper, public BBufferConsumer { private: BStringView* fStatusLine; - uint32 fInternalID; + int32 fInternalID; BMediaAddOn* fAddOn; thread_id fFtpThread; @@ -129,7 +129,7 @@ class VideoConsumer : public BMediaEventLooper, public BBufferConsumer { BBitmap* fBitmap[3]; bool fOurBuffers; BBufferGroup* fBuffers; - uint32 fBufferMap[3]; + BBuffer* fBufferMap[3]; BBitmap* fFtpBitmap; volatile bool fTimeToFtp; From dc4e3ce33748d2d2b4138a433bb3839c388168e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 13:40:12 +0200 Subject: [PATCH 002/136] added B_PRIxOFF --- headers/os/support/SupportDefs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/headers/os/support/SupportDefs.h b/headers/os/support/SupportDefs.h index a37bd7d141..7cc5aaf67e 100644 --- a/headers/os/support/SupportDefs.h +++ b/headers/os/support/SupportDefs.h @@ -137,6 +137,7 @@ typedef generic_addr_t generic_size_t; /* off_t */ #define B_PRIdOFF B_PRId64 #define B_PRIiOFF B_PRIi64 +#define B_PRIxOFF B_PRIx64 /* dev_t */ #define B_PRIdDEV B_PRId32 #define B_PRIiDEV B_PRIi32 From 48350f1a72b010a532b54c818d64e9f69d797bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 13:48:24 +0200 Subject: [PATCH 003/136] bluetooth_server: some 64 bit fixes --- src/servers/bluetooth/BluetoothServer.cpp | 10 ++++++---- src/servers/bluetooth/HCITransportAccessor.cpp | 8 ++++---- src/servers/bluetooth/LocalDeviceHandler.cpp | 5 +++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/servers/bluetooth/BluetoothServer.cpp b/src/servers/bluetooth/BluetoothServer.cpp index 40da9daf1d..d5ea861934 100644 --- a/src/servers/bluetooth/BluetoothServer.cpp +++ b/src/servers/bluetooth/BluetoothServer.cpp @@ -344,7 +344,8 @@ BluetoothServer::HandleAcquireLocalDevice(BMessage* message, BMessage* reply) for (int index = lastIndex + 1; index < fLocalDevicesList.CountItems(); index++) { lDeviceImpl= fLocalDevicesList.ItemAt(index); - printf("Requesting local device %ld\n", lDeviceImpl->GetID()); + printf("Requesting local device %" B_PRId32 "\n", + lDeviceImpl->GetID()); if (lDeviceImpl != NULL && lDeviceImpl->Available()) { Output::Instance()->Postf(BLACKBOARD_KIT, "Device available: %lx\n", lDeviceImpl->GetID()); @@ -357,7 +358,8 @@ BluetoothServer::HandleAcquireLocalDevice(BMessage* message, BMessage* reply) if (lDeviceImpl == NULL) { for (int index = 0; index <= lastIndex ; index ++) { lDeviceImpl = fLocalDevicesList.ItemAt(index); - printf("Requesting local device %ld\n", lDeviceImpl->GetID()); + printf("Requesting local device %" B_PRId32 "\n", + lDeviceImpl->GetID()); if (lDeviceImpl != NULL && lDeviceImpl->Available()) { Output::Instance()->Postf(BLACKBOARD_KIT, "Device available: %lx\n", lDeviceImpl->GetID()); @@ -600,7 +602,7 @@ BluetoothServer::_InstallDeskbarIcon() status_t res = deskbar.AddItem(&appInfo.ref); if (res != B_OK) { - printf("Failed adding deskbar icon: %ld\n", res); + printf("Failed adding deskbar icon: %" B_PRId32 "\n", res); } } @@ -611,7 +613,7 @@ BluetoothServer::_RemoveDeskbarIcon() BDeskbar deskbar; status_t res = deskbar.RemoveItem(kDeskbarItemName); if (res != B_OK) { - printf("Failed removing Deskbar icon: %ld: \n", res); + printf("Failed removing Deskbar icon: %" B_PRId32 ": \n", res); } } diff --git a/src/servers/bluetooth/HCITransportAccessor.cpp b/src/servers/bluetooth/HCITransportAccessor.cpp index 2c070d6697..8e64949323 100644 --- a/src/servers/bluetooth/HCITransportAccessor.cpp +++ b/src/servers/bluetooth/HCITransportAccessor.cpp @@ -20,11 +20,11 @@ HCITransportAccessor::HCITransportAccessor(BPath* path) : HCIDelegate(path) if (fDescriptor > 0) { // find out which ID was assigned status = ioctl(fDescriptor, GET_HCI_ID, &fIdentifier, 0); - printf("%s: hid retrieved %lx status=%ld\n", __FUNCTION__, - fIdentifier, status); + printf("%s: hid retrieved %" B_PRIx32 " status=%" B_PRId32 "\n", + __FUNCTION__, fIdentifier, status); } else { - printf("%s: Device driver %s could not be opened %ld\n", __FUNCTION__, - path->Path(), fIdentifier); + printf("%s: Device driver %s could not be opened %" B_PRId32 "\n", + __FUNCTION__, path->Path(), fIdentifier); fIdentifier = B_ERROR; } diff --git a/src/servers/bluetooth/LocalDeviceHandler.cpp b/src/servers/bluetooth/LocalDeviceHandler.cpp index 8a0e7ff738..7d3936a6fe 100644 --- a/src/servers/bluetooth/LocalDeviceHandler.cpp +++ b/src/servers/bluetooth/LocalDeviceHandler.cpp @@ -93,11 +93,12 @@ LocalDeviceHandler::ClearWantedEvent(BMessage* msg, uint16 event, uint16 opcode) // for each Event while (msg->FindInt16("eventExpected", eventIndex, &eventFound) == B_OK) { - printf("%s:Event expected %d@%ld...\n", __FUNCTION__, event, eventIndex); + printf("%s:Event expected %d@%" B_PRId32 "...\n", __FUNCTION__, event, + eventIndex); if (eventFound == event) { - printf("%s:Event matches@%ld", __FUNCTION__, eventIndex); + printf("%s:Event matches@%" B_PRId32 "\n", __FUNCTION__, eventIndex); // there is an opcode specified if (opcode != 0) { From 60128b54b483dc49e67e08ebbca3f08f5c47edea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 11:57:53 +0200 Subject: [PATCH 004/136] Icon-o-matic: some 64 bit fixes --- src/apps/icon-o-matic/MainWindow.cpp | 2 +- .../icon-o-matic/generic/listener/Observable.cpp | 4 ++-- .../generic/property/view/PropertyListView.cpp | 6 +++--- src/apps/icon-o-matic/generic/support/support.cpp | 2 +- .../import_export/flat_icon/FlatIconExporter.cpp | 12 ++++++------ .../import_export/styled_text/StyledTextImporter.cpp | 4 ++-- .../icon-o-matic/import_export/svg/SVGExporter.cpp | 2 +- src/apps/icon-o-matic/shape/PathManipulator.cpp | 8 ++++---- .../shape/commands/FreezeTransformationCommand.cpp | 2 +- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/apps/icon-o-matic/MainWindow.cpp b/src/apps/icon-o-matic/MainWindow.cpp index d8ac569860..ee5a4ce07d 100644 --- a/src/apps/icon-o-matic/MainWindow.cpp +++ b/src/apps/icon-o-matic/MainWindow.cpp @@ -176,7 +176,7 @@ MainWindow::MessageReceived(BMessage* message) if (message->WasDropped()) { const rgb_color* color; - int32 length; + ssize_t length; // create styles from dropped colors for (int32 i = 0; message->FindData("RGBColor", B_RGB_COLOR_TYPE, i, (const void**)&color, &length) == B_OK; i++) { diff --git a/src/apps/icon-o-matic/generic/listener/Observable.cpp b/src/apps/icon-o-matic/generic/listener/Observable.cpp index 36d198c388..f1694685f3 100644 --- a/src/apps/icon-o-matic/generic/listener/Observable.cpp +++ b/src/apps/icon-o-matic/generic/listener/Observable.cpp @@ -29,8 +29,8 @@ Observable::~Observable() if (fObservers.CountItems() > 0) { char message[256]; Observer* o = (Observer*)fObservers.ItemAt(0); - sprintf(message, "Observable::~Observable() - %ld " - "observers still watching, first: %s\n", + sprintf(message, "Observable::~Observable() - %" B_PRId32 + " observers still watching, first: %s\n", fObservers.CountItems(), typeid(*o).name()); debugger(message); } diff --git a/src/apps/icon-o-matic/generic/property/view/PropertyListView.cpp b/src/apps/icon-o-matic/generic/property/view/PropertyListView.cpp index dfb220df21..8550dc9222 100644 --- a/src/apps/icon-o-matic/generic/property/view/PropertyListView.cpp +++ b/src/apps/icon-o-matic/generic/property/view/PropertyListView.cpp @@ -399,7 +399,7 @@ PropertyListView::SetTo(PropertyObject* object) // unkown to the PropertyEditorFactory and therefor // there is no editor view at this item fprintf(stderr, "PropertyListView::_SetTo() - " - "property mismatch at %ld\n", i); + "property mismatch at %" B_PRId32 "\n", i); error = true; break; } @@ -425,7 +425,7 @@ PropertyListView::SetTo(PropertyObject* object) int32 focused = -1; for (int32 i = 0; PropertyItemView* item = _ItemAt(i); i++) { if (item->IsSelected()) - selection.AddItem((void*)i); + selection.AddItem((void*)(long)i); if (item->IsFocused()) focused = i; } @@ -449,7 +449,7 @@ PropertyListView::SetTo(PropertyObject* object) // restore scroll pos, selection and focus SetScrollOffset(scrollOffset); for (int32 i = 0; PropertyItemView* item = _ItemAt(i); i++) { - if (selection.HasItem((void*)i)) + if (selection.HasItem((void*)(long)i)) item->SetSelected(true); if (i == focused) item->MakeFocus(true); diff --git a/src/apps/icon-o-matic/generic/support/support.cpp b/src/apps/icon-o-matic/generic/support/support.cpp index 77e1e3298e..f2f7fc9de8 100644 --- a/src/apps/icon-o-matic/generic/support/support.cpp +++ b/src/apps/icon-o-matic/generic/support/support.cpp @@ -111,7 +111,7 @@ append_float(BString& string, float n, int32 maxDigits) n = n - rounded; rounded = (int32)(n * pow(10, maxDigits)); char tmp[maxDigits + 1]; - sprintf(tmp, "%0*ld", (int)maxDigits, rounded); + sprintf(tmp, "%0*" B_PRId32, (int)maxDigits, rounded); tmp[maxDigits] = 0; int32 digits = strlen(tmp); for (int32 i = strlen(tmp) - 1; i >= 0; i--) { diff --git a/src/apps/icon-o-matic/import_export/flat_icon/FlatIconExporter.cpp b/src/apps/icon-o-matic/import_export/flat_icon/FlatIconExporter.cpp index 10ac43fbde..a0eb7b8c24 100644 --- a/src/apps/icon-o-matic/import_export/flat_icon/FlatIconExporter.cpp +++ b/src/apps/icon-o-matic/import_export/flat_icon/FlatIconExporter.cpp @@ -51,12 +51,12 @@ FlatIconExporter::~FlatIconExporter() { #if PRINT_STATISTICS printf("Statistics\n" - "--style section size: %ld\n" - " gradients: %ld\n" - " gradient transforms: %ld\n" - "---path section size: %ld\n" - "--shape section size: %ld\n" - "---total/different points: %ld/%lu\n", + "--style section size: %" B_PRId32 "\n" + " gradients: %" B_PRId32 "\n" + " gradient transforms: %" B_PRId32 "\n" + "---path section size: %" B_PRId32 "\n" + "--shape section size: %" B_PRId32 "\n" + "---total/different points: %" B_PRId32 "/%" B_PRIdSSIZE "\n", fStyleSectionSize, fGradientSize, fGradientTransformSize, diff --git a/src/apps/icon-o-matic/import_export/styled_text/StyledTextImporter.cpp b/src/apps/icon-o-matic/import_export/styled_text/StyledTextImporter.cpp index 0d6b10f5a1..eaa9902265 100644 --- a/src/apps/icon-o-matic/import_export/styled_text/StyledTextImporter.cpp +++ b/src/apps/icon-o-matic/import_export/styled_text/StyledTextImporter.cpp @@ -186,14 +186,14 @@ StyledTextImporter::Import(Icon* icon, BMessage* clipping) { CALLED(); const char *text; - int32 textLength; + ssize_t textLength; if (clipping == NULL) return ENOENT; if (clipping->FindData("text/plain", B_MIME_TYPE, (const void **)&text, &textLength) == B_OK) { text_run_array *runs = NULL; - int32 runsLength; + ssize_t runsLength; if (clipping->FindData("application/x-vnd.Be-text_run_array", B_MIME_TYPE, (const void **)&runs, &runsLength) < B_OK) runs = NULL; diff --git a/src/apps/icon-o-matic/import_export/svg/SVGExporter.cpp b/src/apps/icon-o-matic/import_export/svg/SVGExporter.cpp index 0b57dc7bc0..ee9fcec11c 100644 --- a/src/apps/icon-o-matic/import_export/svg/SVGExporter.cpp +++ b/src/apps/icon-o-matic/import_export/svg/SVGExporter.cpp @@ -490,7 +490,7 @@ SVGExporter::_GetFill(const Style* style, char* string, status_t ret = B_OK; if (Gradient* gradient = style->Gradient()) { ret = _ExportGradient(gradient, stream); - sprintf(string, "url(#gradient%ld)", fGradientCount++); + sprintf(string, "url(#gradient%" B_PRId32 ")", fGradientCount++); } else { sprintf(string, "#%.2x%.2x%.2x", style->Color().red, style->Color().green, diff --git a/src/apps/icon-o-matic/shape/PathManipulator.cpp b/src/apps/icon-o-matic/shape/PathManipulator.cpp index 4a06a510a5..fa30575a61 100644 --- a/src/apps/icon-o-matic/shape/PathManipulator.cpp +++ b/src/apps/icon-o-matic/shape/PathManipulator.cpp @@ -143,21 +143,21 @@ public: break; } } - BList::AddItem((void*)value, index); + BList::AddItem((void*)(long)value, index); } } inline bool Remove(int32 value) - { return BList::RemoveItem((void*)value); } + { return BList::RemoveItem((void*)(long)value); } inline bool Contains(int32 value) const - { return BList::HasItem((void*)value); } + { return BList::HasItem((void*)(long)value); } inline bool IsEmpty() const { return BList::IsEmpty(); } inline int32 IndexAt(int32 index) const - { return (int32)BList::ItemAt(index); } + { return (int32)(long)BList::ItemAt(index); } inline void MakeEmpty() { BList::MakeEmpty(); } diff --git a/src/apps/icon-o-matic/shape/commands/FreezeTransformationCommand.cpp b/src/apps/icon-o-matic/shape/commands/FreezeTransformationCommand.cpp index b7a43f4f3b..105479227a 100644 --- a/src/apps/icon-o-matic/shape/commands/FreezeTransformationCommand.cpp +++ b/src/apps/icon-o-matic/shape/commands/FreezeTransformationCommand.cpp @@ -147,7 +147,7 @@ FreezeTransformationCommand::_ApplyTransformation(Shape* shape, path->ApplyTransform(transform); } else { printf("Not transfering transformation of \"%s\" onto " - "path \"%s\", because %ld other shapes " + "path \"%s\", because %" B_PRId32 " other shapes " "have it assigned.\n", shape->Name(), path->Name(), shapes - 1); } From 55a4a88045ee553e36e92406200079ea13b858d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 14:40:26 +0200 Subject: [PATCH 005/136] Mail: some 64 bit fixes --- src/apps/mail/Content.cpp | 8 ++++---- src/apps/mail/Header.cpp | 4 ++-- src/apps/mail/MailWindow.cpp | 12 ++++++------ src/apps/mail/Prefs.cpp | 4 ++-- src/apps/mail/Signature.cpp | 2 +- src/apps/mail/Status.cpp | 2 +- src/kits/mail/MailAttachment.cpp | 10 +++++----- src/kits/mail/MailContainer.cpp | 6 ++++-- src/kits/mail/MailMessage.cpp | 4 ++-- src/kits/mail/mail_util.cpp | 2 +- 10 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/apps/mail/Content.cpp b/src/apps/mail/Content.cpp index 54927c2441..21b5cd7570 100644 --- a/src/apps/mail/Content.cpp +++ b/src/apps/mail/Content.cpp @@ -148,7 +148,7 @@ FilterHTMLTag(int32 &first, char **t, char *end) // check for some common entities (in ISO-Latin-1) if (first == '&') { // filter out and convert decimal values - if (a[1] == '#' && sscanf(a + 2, "%ld;", &first) == 1) { + if (a[1] == '#' && sscanf(a + 2, "%" B_SCNd32 ";", &first) == 1) { t[0] += strchr(a, ';') - a; return false; } @@ -932,11 +932,11 @@ TTextView::UpdateFont(const BFont* newFont) fFont = *newFont; // update the text run array safely with new font - text_run_array *runArray = RunArray(0, LONG_MAX); + text_run_array *runArray = RunArray(0, INT32_MAX); for (int i = 0; i < runArray->count; i++) runArray->runs[i].font = *newFont; - SetRunArray(0, LONG_MAX, runArray); + SetRunArray(0, INT32_MAX, runArray); FreeRunArray(runArray); } @@ -1917,7 +1917,7 @@ TTextView::Open(hyper_text *enclosure) strcpy(baseName, enclosure->name ? enclosure->name : "enclosure"); strcpy(name, baseName); for (int32 index = 0; dir.Contains(name); index++) - sprintf(name, "%s_%ld", baseName, index); + sprintf(name, "%s_%" B_PRId32, baseName, index); BEntry entry(path.Path()); entry_ref ref; diff --git a/src/apps/mail/Header.cpp b/src/apps/mail/Header.cpp index 60530c83b7..2fc6165461 100644 --- a/src/apps/mail/Header.cpp +++ b/src/apps/mail/Header.cpp @@ -348,7 +348,7 @@ THeaderView::THeaderView(BRect rect, BRect windowRect, bool incoming, fAccountMenu->AddItem( item = new BMenuItem(B_TRANSLATE(""), NULL)); item->SetEnabled(false); - fAccountID = ~0UL; + fAccountID = ~(int32)0; } // default account is invalid, set to marked // TODO: do this differently, no casting and knowledge @@ -1093,7 +1093,7 @@ QPopupMenu::AddPersonItem(const entry_ref *ref, ino_t node, BString &name, if (!parentMenu->AddItem(newItem, index + 1)) { fprintf (stderr, "QPopupMenu::AddPersonItem: Unable to add menu " - "item \"%s\" at index %ld.\n", sortKey.String(), index + 1); + "item \"%s\" at index %" B_PRId32 ".\n", sortKey.String(), index + 1); delete newItem; } } diff --git a/src/apps/mail/MailWindow.cpp b/src/apps/mail/MailWindow.cpp index f9879d6825..28620739ac 100644 --- a/src/apps/mail/MailWindow.cpp +++ b/src/apps/mail/MailWindow.cpp @@ -2396,7 +2396,7 @@ TMailWindow::Send(bool now) char versionString[255]; sprintf(versionString, - "Mail/Haiku %ld.%ld.%ld", + "Mail/Haiku %" B_PRIu32 ".%" B_PRIu32 ".%" B_PRIu32, info.major, info.middle, info.minor); fMail->SetHeaderField("X-Mailer", versionString); } @@ -2578,7 +2578,7 @@ TMailWindow::SaveAsDraft() if (status == B_OK) break; char appendix[B_FILE_NAME_LENGTH]; - sprintf(appendix, " %ld", i++); + sprintf(appendix, " %" B_PRId32, i++); int32 pos = min_c(sizeof(fileName) - strlen(appendix), originalLength); sprintf(fileName + pos, "%s", appendix); @@ -2746,8 +2746,8 @@ TMailWindow::TrainMessageAs(const char *CommandWord) ErrorExit: beep(); sprintf(errorString, "Unable to train the message file \"%s\" as %s. " - "Possibly useful error code: %s (%ld).", - filePath.Path(), CommandWord, strerror (errorCode), errorCode); + "Possibly useful error code: %s (%" B_PRId32 ").", + filePath.Path(), CommandWord, strerror(errorCode), errorCode); BAlert* alert = new BAlert("", errorString, B_TRANSLATE("OK")); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); @@ -2921,7 +2921,7 @@ TMailWindow::OpenMessage(const entry_ref *ref, uint32 characterSetForDecoding) // Put the addresses in the 'Save Address' Menu // BMenuItem *item; - while ((item = fSaveAddrMenu->RemoveItem(0L)) != NULL) + while ((item = fSaveAddrMenu->RemoveItem((int32)0)) != NULL) delete item; // create the list of addresses @@ -2935,7 +2935,7 @@ TMailWindow::OpenMessage(const entry_ref *ref, uint32 characterSetForDecoding) BMessage *msg; for (int32 i = addressList.CountItems(); i-- > 0;) { - char *address = (char *)addressList.RemoveItem(0L); + char *address = (char *)addressList.RemoveItem((int32)0); // insert the new address in alphabetical order int32 index = 0; diff --git a/src/apps/mail/Prefs.cpp b/src/apps/mail/Prefs.cpp index 8611f1f917..45b32cd151 100644 --- a/src/apps/mail/Prefs.cpp +++ b/src/apps/mail/Prefs.cpp @@ -338,7 +338,7 @@ TPrefsWindow::MessageReceived(BMessage* msg) fNewFont->SetSize(old_size); if (revert) { - sprintf(label, "%ld", old_size); + sprintf(label, "%" B_PRId32, old_size); item = fSizeMenu->FindItem(label); if (item != NULL) item->SetMarked(true); @@ -759,7 +759,7 @@ TPrefsWindow::_BuildSizeMenu(BFont* font) for (loop = 0; loop < sizeof(sizes) / sizeof(int32); loop++) { msg = new BMessage(P_SIZE); msg->AddInt32("size", sizes[loop]); - sprintf(label, "%ld", sizes[loop]); + sprintf(label, "%" B_PRId32, sizes[loop]); menu->AddItem(item = new BMenuItem(label, msg)); if (sizes[loop] == (int32)size) item->SetMarked(true); diff --git a/src/apps/mail/Signature.cpp b/src/apps/mail/Signature.cpp index 48a02034f1..dc8bcf949e 100644 --- a/src/apps/mail/Signature.cpp +++ b/src/apps/mail/Signature.cpp @@ -369,7 +369,7 @@ TSignatureWindow::Save() fFile = new BFile(); while(true) { - sprintf(name, "signature_%ld", index++); + sprintf(name, "signature_%" B_PRId32, index++); if ((result = dir.CreateFile(name, fFile, true)) == B_NO_ERROR) break; if (result != EEXIST) diff --git a/src/apps/mail/Status.cpp b/src/apps/mail/Status.cpp index 544646f9d1..7acee481a2 100644 --- a/src/apps/mail/Status.cpp +++ b/src/apps/mail/Status.cpp @@ -165,7 +165,7 @@ TStatusWindow::MessageReceived(BMessage* msg) break; if (result != EEXIST) goto err_exit; - sprintf(newName, "%s_%ld", name, index++); + sprintf(newName, "%s_%" B_PRId32, name, index++); } dir.FindEntry(newName, &entry); node = new BNodeInfo(&file); diff --git a/src/kits/mail/MailAttachment.cpp b/src/kits/mail/MailAttachment.cpp index 057427e2cc..be734bfb56 100644 --- a/src/kits/mail/MailAttachment.cpp +++ b/src/kits/mail/MailAttachment.cpp @@ -320,7 +320,7 @@ BSimpleMailAttachment::SetToRFC822(BPositionIO *data, size_t length, BMailComponent::SetToRFC822(data, length, parseNow); // this actually happens... - if (data->Position() - position > length) + if (data->Position() - position > (off_t)length) return B_ERROR; length -= (data->Position() - position); @@ -519,8 +519,8 @@ BAttributedMailAttachment::SetTo(BFile *file, bool deleteFileWhenDone) // Also, we have the make up the boundary out of whole cloth // This is likely to give a completely random string BString boundary; - boundary << "BFile--" << (int32(file) ^ time(NULL)) << "-" - << ~((int32)file ^ (int32)&fStatus ^ (int32)&_attributes) << "--"; + boundary << "BFile--" << ((long)file ^ time(NULL)) << "-" + << ~((long)file ^ (long)&fStatus ^ (long)&_attributes) << "--"; fContainer->SetBoundary(boundary.String()); return fStatus = B_OK; @@ -558,8 +558,8 @@ BAttributedMailAttachment::SetTo(entry_ref *ref) buffer[i] = '_'; } buffer[32] = '\0'; - boundary << "BFile-" << buffer << "--" << ((int32)_data ^ time(NULL)) - << "-" << ~((int32)_data ^ (int32)&buffer ^ (int32)&_attributes) + boundary << "BFile-" << buffer << "--" << ((long)_data ^ time(NULL)) + << "-" << ~((long)_data ^ (long)&buffer ^ (long)&_attributes) << "--"; fContainer->SetBoundary(boundary.String()); diff --git a/src/kits/mail/MailContainer.cpp b/src/kits/mail/MailContainer.cpp index a348b41769..97f07ebadb 100644 --- a/src/kits/mail/MailContainer.cpp +++ b/src/kits/mail/MailContainer.cpp @@ -425,8 +425,10 @@ status_t BMIMEMultipartMailContainer::RenderToRFC822(BPositionIO *render_to) { ssize_t amountWritten, length; message_part *part = (message_part *)_components_in_raw.ItemAt(i); - for (off_t begin = part->start; begin < part->end; begin += sizeof(buffer)) { - length = ((part->end - begin) >= sizeof(buffer)) ? sizeof(buffer) : (part->end - begin); + for (off_t begin = part->start; begin < part->end; + begin += sizeof(buffer)) { + length = (((off_t)part->end - begin) >= (off_t)sizeof(buffer)) + ? sizeof(buffer) : (part->end - begin); _io_data->ReadAt(begin,buffer,length); amountWritten = render_to->Write(buffer,length); diff --git a/src/kits/mail/MailMessage.cpp b/src/kits/mail/MailMessage.cpp index e91139f5b7..abf7de28b1 100644 --- a/src/kits/mail/MailMessage.cpp +++ b/src/kits/mail/MailMessage.cpp @@ -122,7 +122,7 @@ BEmailMessage::ReplyMessage(mail_reply_to_mode replyTo, bool accountFromMail, BString cc; for (int32 i = list.CountItems(); i-- > 0;) { - char *address = (char *)list.RemoveItem(0L); + char *address = (char *)list.RemoveItem((int32)0); // add everything which is not the sender and not already in the list if (sender.ICompare(address) && cc.FindFirst(address) < 0) { @@ -731,7 +731,7 @@ BEmailMessage::RenderToRFC822(BPositionIO *file) BString recipients; for (int32 i = recipientList.CountItems(); i-- > 0;) { - char *address = (char *)recipientList.RemoveItem(0L); + char *address = (char *)recipientList.RemoveItem((int32)0); recipients << '<' << address << '>'; if (i) diff --git a/src/kits/mail/mail_util.cpp b/src/kits/mail/mail_util.cpp index 8d8c86e0a2..e7ea0a6cd6 100644 --- a/src/kits/mail/mail_util.cpp +++ b/src/kits/mail/mail_util.cpp @@ -681,7 +681,7 @@ utf8_to_rfc2047 (char **bufp, ssize_t length, uint32 charset, char encoding) } } - while ((currentWord = (struct word *)words.RemoveItem(0L)) != NULL) { + while ((currentWord = (struct word *)words.RemoveItem((int32)0)) != NULL) { if ((encoding != quoted_printable && encoding != base64) || !currentWord->needsEncoding) { rfc2047.Append (currentWord->convertedWord); From cf91714bf27a0166f5c6bed025a196aff35fb274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 14:15:27 +0200 Subject: [PATCH 006/136] Magnify: some 64 bit fixes --- src/apps/magnify/Magnify.cpp | 25 ++++++++++++++----------- src/apps/magnify/Magnify.h | 2 +- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/apps/magnify/Magnify.cpp b/src/apps/magnify/Magnify.cpp index c757b637a9..85184c99bd 100644 --- a/src/apps/magnify/Magnify.cpp +++ b/src/apps/magnify/Magnify.cpp @@ -873,8 +873,8 @@ TInfoView::Draw(BRect updateRect) float h = Bounds().Height(); if (ch2Showing) { MovePenTo(10, h-12); - sprintf(str, "2) x: %li y: %li y: %i", (int32)pt2.x, (int32)pt2.y, - abs((int)(pt1.y - pt2.y))); + sprintf(str, "2) x: %" B_PRIi32 " y: %" B_PRIi32 " y: %d", + (int32)pt2.x, (int32)pt2.y, abs((int)(pt1.y - pt2.y))); invalRect.Set(10, h-12-fFontHeight, 10 + StringWidth(fCH2Str), h-10); SetHighColor(ViewColor()); FillRect(invalRect); @@ -886,8 +886,8 @@ TInfoView::Draw(BRect updateRect) if (ch1Showing && ch2Showing) { MovePenTo(10, h-10-fFontHeight-2); - sprintf(str, "1) x: %li y: %li x: %i", (int32)pt1.x, (int32)pt1.y, - abs((int)(pt1.x - pt2.x))); + sprintf(str, "1) x: %" B_PRIi32 " y: %" B_PRIi32 " x: %d", + (int32)pt1.x, (int32)pt1.y, abs((int)(pt1.x - pt2.x))); invalRect.Set(10, h-10-2*fFontHeight-2, 10 + StringWidth(fCH1Str), h-10-fFontHeight); SetHighColor(ViewColor()); FillRect(invalRect); @@ -897,7 +897,7 @@ TInfoView::Draw(BRect updateRect) DrawString(fCH1Str); } else if (ch1Showing) { MovePenTo(10, h-10); - sprintf(str, "x: %li y: %li", (int32)pt1.x, (int32)pt1.y); + sprintf(str, "x: %" B_PRIi32 " y: %" B_PRIi32, (int32)pt1.x, (int32)pt1.y); invalRect.Set(10, h-10-fFontHeight, 10 + StringWidth(fCH1Str), h-8); SetHighColor(ViewColor()); FillRect(invalRect); @@ -1410,7 +1410,7 @@ void TMagnify::NudgeMouse(float x, float y) { BPoint loc; - ulong button; + uint32 button; GetMouse(&loc, &button); ConvertToScreen(&loc); @@ -1429,7 +1429,7 @@ TMagnify::WindowActivated(bool active) } -long +status_t TMagnify::MagnifyTask(void *arg) { TMagnify* view = (TMagnify*)arg; @@ -1456,7 +1456,7 @@ void TMagnify::Update(bool force) { BPoint loc; - ulong button; + uint32 button; static long counter = 0; if (!fStickCoordinates) { @@ -1697,11 +1697,14 @@ TMagnify::SaveBits(BFile* file, const BBitmap *bitmap, const char* name) const char str[1024]; // stream out the width, height and ColorSpace - sprintf(str, "const int32 k%sWidth = %ld;\n", name, (int32)bitmap->Bounds().Width()+1); + sprintf(str, "const int32 k%sWidth = %" B_PRIi32 ";\n", name, + (int32)bitmap->Bounds().Width()+1); file->Write(str, strlen(str)); - sprintf(str, "const int32 k%sHeight = %ld;\n", name, (int32)bitmap->Bounds().Height()+1); + sprintf(str, "const int32 k%sHeight = %" B_PRIi32 ";\n", name, + (int32)bitmap->Bounds().Height()+1); file->Write(str, strlen(str)); - sprintf(str, "const color_space k%sColorSpace = %s;\n\n", name, kColorSpaceName); + sprintf(str, "const color_space k%sColorSpace = %s;\n\n", name, + kColorSpaceName); file->Write(str, strlen(str)); // stream out the constant name for this array diff --git a/src/apps/magnify/Magnify.h b/src/apps/magnify/Magnify.h index c4d468caee..ae19a719d9 100644 --- a/src/apps/magnify/Magnify.h +++ b/src/apps/magnify/Magnify.h @@ -119,7 +119,7 @@ class TMagnify : public BView { void EndSave(); private: - static long MagnifyTask(void *); + static status_t MagnifyTask(void *); bool fNeedToUpdate; long fThread; // magnify thread id From 113817f035bc6877d0f9d85abb1fe912369413ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 14:52:21 +0200 Subject: [PATCH 007/136] MediaPlayer: 64 bit build fixes for an ugly use of BList. --- src/apps/mediaplayer/playlist/ListViews.cpp | 14 +++++++------- src/apps/mediaplayer/playlist/PlaylistListView.cpp | 6 +++--- .../playlist/RandomizePLItemsCommand.cpp | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/apps/mediaplayer/playlist/ListViews.cpp b/src/apps/mediaplayer/playlist/ListViews.cpp index c5dbbb6e0f..c8eebcd126 100644 --- a/src/apps/mediaplayer/playlist/ListViews.cpp +++ b/src/apps/mediaplayer/playlist/ListViews.cpp @@ -328,7 +328,7 @@ DragSortableListView::MessageReceived(BMessage* message) BList indices; int32 index; for (int32 i = 0; message->FindInt32("index", i, &index) == B_OK; i++) - indices.AddItem((void*)index); + indices.AddItem((void*)(long)index); if (indices.CountItems() > 0) { if (modifiers() & B_SHIFT_KEY) CopyItems(indices, fDropIndex); @@ -636,7 +636,7 @@ DragSortableListView::MoveItems(const BList& indices, int32 index) BList removedItems; int32 count = indices.CountItems(); for (int32 i = 0; i < count; i++) { - int32 removeIndex = (int32)indices.ItemAtFast(i) - i; + int32 removeIndex = (int32)(long)indices.ItemAtFast(i) - i; BListItem* item = RemoveItem(removeIndex); if (item && removedItems.AddItem((void*)item)) { if (removeIndex < index) @@ -669,9 +669,9 @@ DragSortableListView::CopyItems(const BList& indices, int32 toIndex) BList clonedItems; int32 count = indices.CountItems(); for (int32 i = 0; i < count; i++) { - int32 index = (int32)indices.ItemAtFast(i); + int32 index = (int32)(long)indices.ItemAtFast(i); BListItem* item = CloneItem(index); - if (item && !clonedItems.AddItem((void*)item)) + if (item && !clonedItems.AddItem((void*)(long)item)) delete item; } count = clonedItems.CountItems(); @@ -693,7 +693,7 @@ DragSortableListView::RemoveItemList(const BList& indices) { int32 count = indices.CountItems(); for (int32 i = 0; i < count; i++) { - int32 index = (int32)indices.ItemAtFast(i) - i; + int32 index = (int32)(long)indices.ItemAtFast(i) - i; delete RemoveItem(index); } } @@ -706,7 +706,7 @@ DragSortableListView::GetSelectedItems(BList& indices) int32 index = CurrentSelection(i); if (index < 0) break; - if (!indices.AddItem((void*)index)) + if (!indices.AddItem((void*)(long)index)) break; } } @@ -731,7 +731,7 @@ DragSortableListView::RemoveAll() BList indices; int32 count = CountItems(); for (int32 i = 0; i < count; i++) { - if (!indices.AddItem((void*)i)) + if (!indices.AddItem((void*)(long)i)) break; } diff --git a/src/apps/mediaplayer/playlist/PlaylistListView.cpp b/src/apps/mediaplayer/playlist/PlaylistListView.cpp index df2e04811b..7c80341990 100644 --- a/src/apps/mediaplayer/playlist/PlaylistListView.cpp +++ b/src/apps/mediaplayer/playlist/PlaylistListView.cpp @@ -425,7 +425,7 @@ PlaylistListView::Randomize() int32 index = CurrentSelection(count); if (index < 0) break; - if (!indices.AddItem((void*)index)) + if (!indices.AddItem((void*)(long)index)) return; count++; } @@ -435,7 +435,7 @@ PlaylistListView::Randomize() // no selection, simply add all items count = CountItems(); for (int32 i = 0; i < count; i++) { - if (!indices.AddItem((void*)i)) + if (!indices.AddItem((void*)(long)i)) return; } } @@ -458,7 +458,7 @@ void PlaylistListView::RemoveToTrash(int32 index) { BList indices; - indices.AddItem((void*)index); + indices.AddItem((void*)(long)index); RemoveItemList(indices, true); } diff --git a/src/apps/mediaplayer/playlist/RandomizePLItemsCommand.cpp b/src/apps/mediaplayer/playlist/RandomizePLItemsCommand.cpp index 3f9ad41129..77de4a0794 100644 --- a/src/apps/mediaplayer/playlist/RandomizePLItemsCommand.cpp +++ b/src/apps/mediaplayer/playlist/RandomizePLItemsCommand.cpp @@ -48,7 +48,7 @@ RandomizePLItemsCommand::RandomizePLItemsCommand(Playlist* playlist, BList indexSet; for (int32 i = 0; i < fCount; i++) { fItems[i] = fPlaylist->ItemAt(fListIndices[i]); - if (fItems[i] == NULL || !indexSet.AddItem((void*)i)) { + if (fItems[i] == NULL || !indexSet.AddItem((void*)(long)i)) { // indicate a bad object state delete[] fItems; fItems = NULL; @@ -59,7 +59,7 @@ RandomizePLItemsCommand::RandomizePLItemsCommand(Playlist* playlist, // remove the indices from the set in random order for (int32 i = 0; i < fCount; i++) { int32 randomSetIndex = rand() % indexSet.CountItems(); - fRandomInternalIndices[i] = (int32)indexSet.RemoveItem(randomSetIndex); + fRandomInternalIndices[i] = (int32)(long)indexSet.RemoveItem(randomSetIndex); } } From bd380b558ac049d9b29f9e9ce475f5aae6564eb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 14:58:53 +0200 Subject: [PATCH 008/136] PackageInstaller: some 64 bit fixes --- src/apps/packageinstaller/PackageInfo.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/packageinstaller/PackageInfo.cpp b/src/apps/packageinstaller/PackageInfo.cpp index 22cfe55e35..93549344ad 100644 --- a/src/apps/packageinstaller/PackageInfo.cpp +++ b/src/apps/packageinstaller/PackageInfo.cpp @@ -73,7 +73,7 @@ PackageInfo::~PackageInfo() { pkg_profile *iter = 0; while (1) { - iter = static_cast(fProfiles.RemoveItem((long int)0)); + iter = static_cast(fProfiles.RemoveItem((int32)0)); if (iter == NULL) break; @@ -82,7 +82,7 @@ PackageInfo::~PackageInfo() PackageItem *file = 0; while (true) { - file = static_cast(fFiles.RemoveItem((long int)0)); + file = static_cast(fFiles.RemoveItem((int32)0)); if (file == NULL) break; @@ -90,7 +90,7 @@ PackageInfo::~PackageInfo() } while (true) { - file = static_cast(fScripts.RemoveItem((long int)0)); + file = static_cast(fScripts.RemoveItem((int32)0)); if (file == NULL) break; From 14b32de1d5efe99b4c6d4ef8c25df47eb009cf0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 15:00:54 +0200 Subject: [PATCH 009/136] People: some 64 bit fixes --- src/apps/people/PersonView.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/people/PersonView.cpp b/src/apps/people/PersonView.cpp index 9dc3165ef1..656bef1021 100644 --- a/src/apps/people/PersonView.cpp +++ b/src/apps/people/PersonView.cpp @@ -217,7 +217,7 @@ PersonView::BuildGroupMenu() if (file.InitCheck() == B_OK && file.GetAttrInfo(fCategoryAttribute, &info) == B_OK && info.size > 1) { - if (info.size > sizeof(buffer)) + if (info.size > (off_t)sizeof(buffer)) info.size = sizeof(buffer); if (file.ReadAttr(fCategoryAttribute.String(), B_STRING_TYPE, From 3e4cf3a1b815340796780eb8ae0e648b2d1a72f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 15:04:32 +0200 Subject: [PATCH 010/136] PowerStatus: some 64 bit fixes --- src/apps/powerstatus/PowerStatusView.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/apps/powerstatus/PowerStatusView.cpp b/src/apps/powerstatus/PowerStatusView.cpp index 62ef64e4d7..c7a6968243 100644 --- a/src/apps/powerstatus/PowerStatusView.cpp +++ b/src/apps/powerstatus/PowerStatusView.cpp @@ -321,10 +321,11 @@ PowerStatusView::_SetLabel(char* buffer, size_t bufferLength) close = ")"; } - if (!fShowTime && fPercent >= 0) - snprintf(buffer, bufferLength, "%s%ld%%%s", open, fPercent, close); - else if (fShowTime && fTimeLeft >= 0) { - snprintf(buffer, bufferLength, "%s%ld:%02ld%s", + if (!fShowTime && fPercent >= 0) { + snprintf(buffer, bufferLength, "%s%" B_PRId32 "%%%s", open, fPercent, + close); + } else if (fShowTime && fTimeLeft >= 0) { + snprintf(buffer, bufferLength, "%s%" B_PRId32 ":%02" B_PRId32 "%s", open, fTimeLeft / 3600, (fTimeLeft / 60) % 60, close); } } @@ -372,11 +373,12 @@ PowerStatusView::Update(bool force) close = ")"; } if (fHasBattery) { - size_t length = snprintf(text, sizeof(text), "%s%ld%%%s", - open, fPercent, close); + size_t length = snprintf(text, sizeof(text), "%s%" B_PRId32 + "%%%s", open, fPercent, close); if (fTimeLeft) { length += snprintf(text + length, sizeof(text) - length, - "\n%ld:%02ld", fTimeLeft / 3600, (fTimeLeft / 60) % 60); + "\n%" B_PRId32 ":%02" B_PRId32, fTimeLeft / 3600, + (fTimeLeft / 60) % 60); } const char* state = NULL; From c0722add753912f2c678964522fd8bd81803f668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 15:11:09 +0200 Subject: [PATCH 011/136] TextSearch: some 64 bit fixes --- src/apps/text_search/Grepper.cpp | 10 +++++----- src/apps/text_search/Model.cpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/apps/text_search/Grepper.cpp b/src/apps/text_search/Grepper.cpp index a20103e7d0..00b6657a86 100644 --- a/src/apps/text_search/Grepper.cpp +++ b/src/apps/text_search/Grepper.cpp @@ -69,8 +69,8 @@ strdup_to_utf8(uint32 encode, const char* src, int32 length) char* dup = strdup(dst); delete[] dst; if (srcLen != length) { - fprintf(stderr, "strdup_to_utf8(%ld, %ld) dst allocate smalled(%ld)\n", - encode, length, dstLen); + fprintf(stderr, "strdup_to_utf8(%" B_PRId32 ", %" B_PRId32 + ") dst allocate smalled(%" B_PRId32 ")\n", encode, length, dstLen); } return dup; } @@ -91,8 +91,8 @@ strdup_from_utf8(uint32 encode, const char* src, int32 length) char* dup = strdup(dst); delete[] dst; if (srcLen != length) { - fprintf(stderr, "strdup_from_utf8(%ld, %ld) dst allocate " - "smalled(%ld)\n", encode, length, dstLen); + fprintf(stderr, "strdup_from_utf8(%" B_PRId32 ", %" B_PRId32 + ") dst allocate smalled(%" B_PRId32 ")\n", encode, length, dstLen); } return dup; } @@ -183,7 +183,7 @@ Grepper::_GrepperThread() char command[B_PATH_NAME_LENGTH + 32]; BPath tempFile; - sprintf(fileName, "/tmp/SearchText%ld", fThreadId); + sprintf(fileName, "/tmp/SearchText%" B_PRId32, fThreadId); tempFile.SetTo(fileName); while (!fMustQuit && fIterator->GetNextName(fileName)) { diff --git a/src/apps/text_search/Model.cpp b/src/apps/text_search/Model.cpp index d90d6e3873..eb847a963b 100644 --- a/src/apps/text_search/Model.cpp +++ b/src/apps/text_search/Model.cpp @@ -29,7 +29,7 @@ using std::nothrow; Model::Model() : fDirectory(), - fSelectedFiles(0UL), + fSelectedFiles((uint32)0), fRecurseDirs(true), fRecurseLinks(false), @@ -204,7 +204,7 @@ Model::AddToHistory(const char* text) } while (items.CountItems() >= HISTORY_LIMIT) - delete static_cast(items.RemoveItem(0L)); + delete static_cast(items.RemoveItem((int32)0)); _SaveHistory(items); _FreeHistory(items); From 2443899f1bb7acc04d59624c229afbf6870b24ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 15:12:35 +0200 Subject: [PATCH 012/136] WebWatch: some 64 bit fixes --- src/apps/webwatch/WatchView.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/webwatch/WatchView.cpp b/src/apps/webwatch/WatchView.cpp index 3488baecc4..ad5f3b441a 100644 --- a/src/apps/webwatch/WatchView.cpp +++ b/src/apps/webwatch/WatchView.cpp @@ -97,7 +97,7 @@ void WatchView::Draw(BRect updateRect) super::Draw(updateRect); char string[5]; - sprintf(string, "@%03ld", GetInternetTime()); + sprintf(string, "@%03" B_PRId32, GetInternetTime()); font_height height; // center the text horizontally GetFontHeight(&height); // and vertically in the Deskbar From a31ac990cc82daeccd7c8deb39e0c634643418fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 13:41:26 +0200 Subject: [PATCH 013/136] Diskprobe: some 64 bit fixes * also warnings about comparisons between signed and non signed. --- src/apps/diskprobe/DataEditor.cpp | 18 +++++++++------ src/apps/diskprobe/DataView.cpp | 12 +++++----- src/apps/diskprobe/ProbeView.cpp | 36 ++++++++++++++++++------------ src/apps/diskprobe/TypeEditors.cpp | 20 ++++++++--------- 4 files changed, 49 insertions(+), 37 deletions(-) diff --git a/src/apps/diskprobe/DataEditor.cpp b/src/apps/diskprobe/DataEditor.cpp index 2fd85a28df..72701cfbd6 100644 --- a/src/apps/diskprobe/DataEditor.cpp +++ b/src/apps/diskprobe/DataEditor.cpp @@ -236,8 +236,10 @@ void ReplaceChange::Apply(off_t bufferOffset, uint8 *buffer, size_t bufferSize) { // is it in our range? - if (fOffset > bufferOffset + bufferSize || fOffset + fSize < bufferOffset) + if (fOffset > (bufferOffset + (off_t)bufferSize) + || (fOffset + (off_t)fSize) < bufferOffset) { return; + } // don't change anything outside the supplied buffer off_t offset = fOffset; @@ -263,8 +265,10 @@ void ReplaceChange::Revert(off_t bufferOffset, uint8 *buffer, size_t bufferSize) { // is it in our range? - if (fOffset - bufferOffset > bufferSize || fOffset + fSize < bufferOffset) + if ((fOffset - bufferOffset) > (off_t)bufferSize + || (fOffset + (off_t)fSize) < bufferOffset) { return; + } // don't change anything outside the supplied buffer off_t offset = fOffset; @@ -307,8 +311,8 @@ ReplaceChange::Merge(DataChange *_change) // are the changes adjacent? - if (change->fOffset + change->fSize != fOffset - && fOffset + fSize != change->fOffset) + if ((change->fOffset + (off_t)change->fSize) != fOffset + && (fOffset + (off_t)fSize) != change->fOffset) return false; // okay, we can try to merge the two changes @@ -560,7 +564,7 @@ DataEditor::Replace(off_t offset, const uint8 *data, size_t length) if (offset >= fSize) return B_BAD_VALUE; - if (offset + length > fSize) + if ((offset + (off_t)length) > fSize) length = fSize - offset; if (fNeedsUpdate) { @@ -705,7 +709,7 @@ DataEditor::Save() // don't try to change the file size size_t size = fRealViewSize; - if (fRealViewOffset + fRealViewSize > fSize) + if ((fRealViewOffset + (off_t)fRealViewSize) > (off_t)fSize) size = fSize - fRealViewOffset; ssize_t bytesWritten; @@ -1125,7 +1129,7 @@ DataEditor::Find(off_t startPosition, const uint8 *data, size_t dataSize, } for (size_t i = firstByte; i < fRealViewSize; i++) { - if (position + i + dataSize > fSize) + if (position + (off_t)(i + dataSize) > (off_t)fSize) break; if (!compareFunc(fView + i, data, 1)) { diff --git a/src/apps/diskprobe/DataView.cpp b/src/apps/diskprobe/DataView.cpp index bd01742cd8..59589437ad 100644 --- a/src/apps/diskprobe/DataView.cpp +++ b/src/apps/diskprobe/DataView.cpp @@ -163,19 +163,19 @@ DataView::UpdateFromEditor(BMessage *message) if (message != NULL && message->FindInt64("offset", &offset) == B_OK && message->FindInt64("size", &size) == B_OK) { - if (offset > fOffset + fDataSize - || offset + size < fOffset) { + if (offset > fOffset + (off_t)fDataSize + || offset + (off_t)size < fOffset) { // the changes are not within our scope, so we can ignore them return; } if (offset > fOffset) start = offset - fOffset; - if (offset + size < fOffset + fDataSize) + if (offset + (off_t)size < fOffset + (off_t)fDataSize) end = offset + size - fOffset; } - if (fOffset + fDataSize > fFileSize) + if (fOffset + (off_t)fDataSize > fFileSize) fSizeInView = fFileSize - fOffset; else fSizeInView = fDataSize; @@ -356,8 +356,8 @@ DataView::ConvertLine(char *line, off_t offset, const uint8 *buffer, size_t size return; } - line += sprintf(line, fBase == kHexBase ? "%0*Lx: " : "%0*Ld: ", - (int)fPositionLength, offset); + line += sprintf(line, fBase == kHexBase ? "%0*" B_PRIxOFF": " : "%0*" + B_PRIdOFF": ", (int)fPositionLength, offset); for (uint32 i = 0; i < kBlockSize; i++) { if (i >= size) { diff --git a/src/apps/diskprobe/ProbeView.cpp b/src/apps/diskprobe/ProbeView.cpp index 2aef09dcaa..943889fcd6 100644 --- a/src/apps/diskprobe/ProbeView.cpp +++ b/src/apps/diskprobe/ProbeView.cpp @@ -216,7 +216,7 @@ get_type_string(char *buffer, size_t bufferSize, type_code type) for (int32 i = 0; i < 4; i++) { buffer[i] = type >> (24 - 8 * i); if (buffer[i] < ' ' || buffer[i] == 0x7f) { - snprintf(buffer, bufferSize, "0x%04lx", type); + snprintf(buffer, bufferSize, "0x%04" B_PRIx32, type); break; } else if (i == 3) buffer[4] = '\0'; @@ -705,7 +705,8 @@ HeaderView::UpdateIcon() void HeaderView::FormatValue(char *buffer, size_t bufferSize, off_t value) { - snprintf(buffer, bufferSize, fBase == kHexBase ? "0x%Lx" : "%Ld", value); + snprintf(buffer, bufferSize, fBase == kHexBase ? "0x%" B_PRIxOFF : "%" + B_PRIdOFF, value); } @@ -1550,7 +1551,7 @@ ProbeView::AttachedToWindow() const uint32 blockSizes[] = {512, 1024, 2048}; for (uint32 i = 0; i < sizeof(blockSizes) / sizeof(blockSizes[0]); i++) { char buffer[32]; - snprintf(buffer, sizeof(buffer), "%ld%s", blockSizes[i], + snprintf(buffer, sizeof(buffer), "%" B_PRId32 "%s", blockSizes[i], fEditor.IsDevice() && fEditor.BlockSize() == blockSizes[i] ? B_TRANSLATE(" (native)") : ""); subMenu->AddItem(item = new BMenuItem(buffer, @@ -1582,7 +1583,7 @@ ProbeView::AttachedToWindow() fontSize = 0; for (uint32 i = 0; i < sizeof(fontSizes) / sizeof(fontSizes[0]); i++) { char buffer[16]; - snprintf(buffer, sizeof(buffer), "%ld", fontSizes[i]); + snprintf(buffer, sizeof(buffer), "%" B_PRId32, fontSizes[i]); subMenu->AddItem(item = new BMenuItem(buffer, message = new BMessage(kMsgFontSize))); message->AddFloat("font_size", fontSizes[i]); @@ -1653,23 +1654,30 @@ ProbeView::_UpdateSelectionMenuItems(int64 start, int64 end) // update menu items char buffer[128]; - if (fDataView->Base() == kHexBase) - snprintf(buffer, sizeof(buffer), B_TRANSLATE("Native: 0x%0*Lx"), size * 2, position); - else - snprintf(buffer, sizeof(buffer), B_TRANSLATE("Native: %Ld (0x%0*Lx)"), position, size * 2, position); + if (fDataView->Base() == kHexBase) { + snprintf(buffer, sizeof(buffer), B_TRANSLATE("Native: 0x%0*Lx"), + size * 2, position); + } else { + snprintf(buffer, sizeof(buffer), B_TRANSLATE("Native: %Ld (0x%0*Lx)"), + position, size * 2, position); + } fNativeMenuItem->SetLabel(buffer); - fNativeMenuItem->SetEnabled(position >= 0 && (position * fEditor.BlockSize()) < fEditor.FileSize()); + fNativeMenuItem->SetEnabled(position >= 0 + && (off_t)(position * fEditor.BlockSize()) < fEditor.FileSize()); fNativeMenuItem->Message()->ReplaceInt64("block", position); position = B_SWAP_INT64(position) >> (8 * (8 - size)); - if (fDataView->Base() == kHexBase) - snprintf(buffer, sizeof(buffer), B_TRANSLATE("Swapped: 0x%0*Lx"), size * 2, position); - else - snprintf(buffer, sizeof(buffer), B_TRANSLATE("Swapped: %Ld (0x%0*Lx)"), position, size * 2, position); + if (fDataView->Base() == kHexBase) { + snprintf(buffer, sizeof(buffer), B_TRANSLATE("Swapped: 0x%0*Lx"), + size * 2, position); + } else { + snprintf(buffer, sizeof(buffer), B_TRANSLATE("Swapped: %Ld (0x%0*Lx)"), + position, size * 2, position); + } fSwappedMenuItem->SetLabel(buffer); - fSwappedMenuItem->SetEnabled(position >= 0 && (position * fEditor.BlockSize()) < fEditor.FileSize()); + fSwappedMenuItem->SetEnabled(position >= 0 && (off_t)(position * fEditor.BlockSize()) < fEditor.FileSize()); fSwappedMenuItem->Message()->ReplaceInt64("block", position); } diff --git a/src/apps/diskprobe/TypeEditors.cpp b/src/apps/diskprobe/TypeEditors.cpp index 2183ff81c2..39bfbf8cb2 100644 --- a/src/apps/diskprobe/TypeEditors.cpp +++ b/src/apps/diskprobe/TypeEditors.cpp @@ -226,7 +226,7 @@ StringEditor::_UpdateText() size_t viewSize = fEditor.ViewSize(); // that may need some more memory... - if (viewSize < fEditor.FileSize()) + if ((off_t)viewSize < fEditor.FileSize()) fEditor.SetViewSize(fEditor.FileSize()); const char *buffer; @@ -486,7 +486,7 @@ NumberEditor::_UpdateText() bool NumberEditor::TypeMatches() { - return fEditor.FileSize() >= _Size(); + return fEditor.FileSize() >= (off_t)_Size(); // we only look at as many bytes we need to } @@ -949,7 +949,7 @@ ImageView::_UpdateImage() size_t viewSize = fEditor.ViewSize(); // that may need some more memory... - if (viewSize < fEditor.FileSize()) + if ((off_t)viewSize < fEditor.FileSize()) fEditor.SetViewSize(fEditor.FileSize()); const char *data; @@ -1169,7 +1169,7 @@ MessageView::_TypeToString(type_code type) for (int32 i = 0; i < 4; i++) { text[i] = type >> (24 - 8 * i); if (text[i] < ' ' || text[i] == 0x7f) { - snprintf(text, sizeof(text), "0x%04lx", type); + snprintf(text, sizeof(text), "0x%04" B_PRIx32, type); break; } else if (i == 3) text[4] = '\0'; @@ -1226,16 +1226,16 @@ MessageView::SetTo(BMessage& message) switch (type) { case B_INT64_TYPE: - snprintf(text, sizeof(text), "%Ld", *(int64*)data); + snprintf(text, sizeof(text), "%" B_PRId64, *(int64*)data); break; case B_UINT64_TYPE: - snprintf(text, sizeof(text), "%Lu", *(uint64*)data); + snprintf(text, sizeof(text), "%" B_PRIu64, *(uint64*)data); break; case B_INT32_TYPE: - snprintf(text, sizeof(text), "%ld", *(int32*)data); + snprintf(text, sizeof(text), "%" B_PRId32, *(int32*)data); break; case B_UINT32_TYPE: - snprintf(text, sizeof(text), "%lu", *(uint32*)data); + snprintf(text, sizeof(text), "%" B_PRIu32, *(uint32*)data); break; case B_BOOL_TYPE: if (*(uint8*)data) @@ -1255,7 +1255,7 @@ MessageView::SetTo(BMessage& message) fTextView->Insert("\t\t"); if (count > 1) { char index[16]; - snprintf(index, sizeof(index), "%ld.\t", j); + snprintf(index, sizeof(index), "%" B_PRId32 ".\t", j); fTextView->Insert(index); } fTextView->Insert(text); @@ -1273,7 +1273,7 @@ MessageView::_UpdateMessage() size_t viewSize = fEditor.ViewSize(); // that may need some more memory... - if (viewSize < fEditor.FileSize()) + if ((off_t)viewSize < fEditor.FileSize()) fEditor.SetViewSize(fEditor.FileSize()); const char *buffer; From 62e60219cc0e6ca897d70524dddf3cbee49a29dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 15:28:36 +0200 Subject: [PATCH 014/136] ShowImage: initialize rgb_color.alpha field. --- src/apps/showimage/Filter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/showimage/Filter.cpp b/src/apps/showimage/Filter.cpp index 6c5769abdd..c8e7fc7735 100644 --- a/src/apps/showimage/Filter.cpp +++ b/src/apps/showimage/Filter.cpp @@ -829,6 +829,7 @@ Scaler::Dither(int32 fromRow, int32 toRow) color.red = Limit(srcData[2] + error[0] / 16); color.green = Limit(srcData[1] + error[1] / 16); color.blue = Limit(srcData[0] + error[2] / 16); + color.alpha = UINT8_MAX; index = screen.IndexForColor(color); actualColor = screen.ColorForIndex(index); @@ -879,6 +880,7 @@ Scaler::Dither(int32 fromRow, int32 toRow) color.red = Limit(srcData[2] + error[0] / 16); color.green = Limit(srcData[1] + error[1] / 16); color.blue = Limit(srcData[0] + error[2] / 16); + color.alpha = UINT8_MAX; index = screen.IndexForColor(color); actualColor = screen.ColorForIndex(index); From 9f0006623c9544286c2683d35a1a5ddef15913bb Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Sat, 4 May 2013 16:16:30 +0200 Subject: [PATCH 015/136] MediaPlayer: addr_t instead of long, as suggested by Ingo. --- src/apps/mediaplayer/playlist/ListViews.cpp | 14 +++++++------- src/apps/mediaplayer/playlist/PlaylistListView.cpp | 6 +++--- .../playlist/RandomizePLItemsCommand.cpp | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/apps/mediaplayer/playlist/ListViews.cpp b/src/apps/mediaplayer/playlist/ListViews.cpp index c8eebcd126..032ffeaa07 100644 --- a/src/apps/mediaplayer/playlist/ListViews.cpp +++ b/src/apps/mediaplayer/playlist/ListViews.cpp @@ -328,7 +328,7 @@ DragSortableListView::MessageReceived(BMessage* message) BList indices; int32 index; for (int32 i = 0; message->FindInt32("index", i, &index) == B_OK; i++) - indices.AddItem((void*)(long)index); + indices.AddItem((void*)(addr_t)index); if (indices.CountItems() > 0) { if (modifiers() & B_SHIFT_KEY) CopyItems(indices, fDropIndex); @@ -636,7 +636,7 @@ DragSortableListView::MoveItems(const BList& indices, int32 index) BList removedItems; int32 count = indices.CountItems(); for (int32 i = 0; i < count; i++) { - int32 removeIndex = (int32)(long)indices.ItemAtFast(i) - i; + int32 removeIndex = (int32)(addr_t)indices.ItemAtFast(i) - i; BListItem* item = RemoveItem(removeIndex); if (item && removedItems.AddItem((void*)item)) { if (removeIndex < index) @@ -669,9 +669,9 @@ DragSortableListView::CopyItems(const BList& indices, int32 toIndex) BList clonedItems; int32 count = indices.CountItems(); for (int32 i = 0; i < count; i++) { - int32 index = (int32)(long)indices.ItemAtFast(i); + int32 index = (int32)(addr_t)indices.ItemAtFast(i); BListItem* item = CloneItem(index); - if (item && !clonedItems.AddItem((void*)(long)item)) + if (item && !clonedItems.AddItem((void*)(addr_t)item)) delete item; } count = clonedItems.CountItems(); @@ -693,7 +693,7 @@ DragSortableListView::RemoveItemList(const BList& indices) { int32 count = indices.CountItems(); for (int32 i = 0; i < count; i++) { - int32 index = (int32)(long)indices.ItemAtFast(i) - i; + int32 index = (int32)(addr_t)indices.ItemAtFast(i) - i; delete RemoveItem(index); } } @@ -706,7 +706,7 @@ DragSortableListView::GetSelectedItems(BList& indices) int32 index = CurrentSelection(i); if (index < 0) break; - if (!indices.AddItem((void*)(long)index)) + if (!indices.AddItem((void*)(addr_t)index)) break; } } @@ -731,7 +731,7 @@ DragSortableListView::RemoveAll() BList indices; int32 count = CountItems(); for (int32 i = 0; i < count; i++) { - if (!indices.AddItem((void*)(long)i)) + if (!indices.AddItem((void*)(addr_t)i)) break; } diff --git a/src/apps/mediaplayer/playlist/PlaylistListView.cpp b/src/apps/mediaplayer/playlist/PlaylistListView.cpp index 7c80341990..940b5a2462 100644 --- a/src/apps/mediaplayer/playlist/PlaylistListView.cpp +++ b/src/apps/mediaplayer/playlist/PlaylistListView.cpp @@ -425,7 +425,7 @@ PlaylistListView::Randomize() int32 index = CurrentSelection(count); if (index < 0) break; - if (!indices.AddItem((void*)(long)index)) + if (!indices.AddItem((void*)(addr_t)index)) return; count++; } @@ -435,7 +435,7 @@ PlaylistListView::Randomize() // no selection, simply add all items count = CountItems(); for (int32 i = 0; i < count; i++) { - if (!indices.AddItem((void*)(long)i)) + if (!indices.AddItem((void*)(addr_t)i)) return; } } @@ -458,7 +458,7 @@ void PlaylistListView::RemoveToTrash(int32 index) { BList indices; - indices.AddItem((void*)(long)index); + indices.AddItem((void*)(addr_t)index); RemoveItemList(indices, true); } diff --git a/src/apps/mediaplayer/playlist/RandomizePLItemsCommand.cpp b/src/apps/mediaplayer/playlist/RandomizePLItemsCommand.cpp index 77de4a0794..da6eec2538 100644 --- a/src/apps/mediaplayer/playlist/RandomizePLItemsCommand.cpp +++ b/src/apps/mediaplayer/playlist/RandomizePLItemsCommand.cpp @@ -48,7 +48,7 @@ RandomizePLItemsCommand::RandomizePLItemsCommand(Playlist* playlist, BList indexSet; for (int32 i = 0; i < fCount; i++) { fItems[i] = fPlaylist->ItemAt(fListIndices[i]); - if (fItems[i] == NULL || !indexSet.AddItem((void*)(long)i)) { + if (fItems[i] == NULL || !indexSet.AddItem((void*)(addr_t)i)) { // indicate a bad object state delete[] fItems; fItems = NULL; @@ -59,7 +59,7 @@ RandomizePLItemsCommand::RandomizePLItemsCommand(Playlist* playlist, // remove the indices from the set in random order for (int32 i = 0; i < fCount; i++) { int32 randomSetIndex = rand() % indexSet.CountItems(); - fRandomInternalIndices[i] = (int32)(long)indexSet.RemoveItem(randomSetIndex); + fRandomInternalIndices[i] = (int32)(addr_t)indexSet.RemoveItem(randomSetIndex); } } From ee668d24e34a6da029d2f188118c023929f97391 Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Sat, 4 May 2013 18:12:51 +0200 Subject: [PATCH 016/136] exfat: Return more than a single dirent at a time in exfat_read_dir(). * similar to what mmlr did in hrev45575 for bfs. * DirectoryIterator could try to read past the end of the directory. * replaced a dprintf with a TRACE() statement. --- .../file_systems/exfat/DirectoryIterator.cpp | 23 ++++++--- .../kernel/file_systems/exfat/Volume.cpp | 4 +- .../kernel/file_systems/exfat/encodings.cpp | 18 +++++-- .../file_systems/exfat/kernel_interface.cpp | 50 ++++++++++++------- 4 files changed, 65 insertions(+), 30 deletions(-) diff --git a/src/add-ons/kernel/file_systems/exfat/DirectoryIterator.cpp b/src/add-ons/kernel/file_systems/exfat/DirectoryIterator.cpp index ffeaff1bac..bfa0553136 100644 --- a/src/add-ons/kernel/file_systems/exfat/DirectoryIterator.cpp +++ b/src/add-ons/kernel/file_systems/exfat/DirectoryIterator.cpp @@ -47,9 +47,13 @@ status_t DirectoryIterator::GetNext(char* name, size_t* _nameLength, ino_t* _id, EntryVisitor* visitor) { + if (fCluster == EXFAT_CLUSTER_END) + return B_ENTRY_NOT_FOUND; if (fOffset == -2) { - *_nameLength = 3; - strlcpy(name, "..", *_nameLength); + if (*_nameLength < 3) + return B_BUFFER_OVERFLOW; + *_nameLength = 2; + strlcpy(name, "..", *_nameLength + 1); if (fInode->ID() == 1) *_id = fInode->ID(); else @@ -58,19 +62,22 @@ DirectoryIterator::GetNext(char* name, size_t* _nameLength, ino_t* _id, TRACE("DirectoryIterator::GetNext() found ..\n"); return B_OK; } else if (fOffset == -1) { - *_nameLength = 2; - strlcpy(name, ".", *_nameLength); + if (*_nameLength < 2) + return B_BUFFER_OVERFLOW; + *_nameLength = 1; + strlcpy(name, ".", *_nameLength + 1); *_id = fInode->ID(); fOffset = 0; TRACE("DirectoryIterator::GetNext() found .\n"); return B_OK; } - uchar unicodeName[EXFAT_FILENAME_MAX_LENGTH]; + uchar unicodeName[EXFAT_FILENAME_MAX_LENGTH + 1]; size_t nameLength = EXFAT_FILENAME_MAX_LENGTH; status_t status = _GetNext(unicodeName, &nameLength, _id, visitor); if (status == B_OK && name != NULL) { - unicode_to_utf8(unicodeName, nameLength, (uint8 *)name , _nameLength); + status = unicode_to_utf8(unicodeName, nameLength, (uint8 *)name, + _nameLength); TRACE("DirectoryIterator::GetNext() %ld %s, %" B_PRIdINO "\n", fInode->Cluster(), name, *_id); } @@ -96,7 +103,7 @@ DirectoryIterator::Lookup(const char* name, size_t nameLength, ino_t* _id) Rewind(); fOffset = 0; - uchar currentName[EXFAT_FILENAME_MAX_LENGTH]; + uchar currentName[EXFAT_FILENAME_MAX_LENGTH + 1]; size_t currentLength = EXFAT_FILENAME_MAX_LENGTH; while (_GetNext((uchar*)currentName, ¤tLength, _id) == B_OK) { char utfName[EXFAT_FILENAME_MAX_LENGTH]; @@ -122,7 +129,7 @@ DirectoryIterator::LookupEntry(EntryVisitor* visitor) fCluster = fInode->Cluster(); fOffset = fInode->Offset(); - uchar unicodeName[EXFAT_FILENAME_MAX_LENGTH]; + uchar unicodeName[EXFAT_FILENAME_MAX_LENGTH + 1]; size_t nameLength = EXFAT_FILENAME_MAX_LENGTH; return _GetNext(unicodeName, &nameLength, NULL, visitor); } diff --git a/src/add-ons/kernel/file_systems/exfat/Volume.cpp b/src/add-ons/kernel/file_systems/exfat/Volume.cpp index 1881909751..8fea222077 100644 --- a/src/add-ons/kernel/file_systems/exfat/Volume.cpp +++ b/src/add-ons/kernel/file_systems/exfat/Volume.cpp @@ -218,7 +218,7 @@ LabelVisitor::LabelVisitor(Volume* volume) bool LabelVisitor::VisitLabel(struct exfat_entry* entry) { - dprintf("LabelVisitor::VisitLabel()\n"); + TRACE("LabelVisitor::VisitLabel()\n"); char utfName[30]; size_t utfLength = 30; unicode_to_utf8((const uchar*)entry->name_label.name, @@ -418,6 +418,8 @@ Volume::LoadSuperBlock() status_t Volume::ClusterToBlock(cluster_t cluster, fsblock_t &block) { + if (cluster < 2) + return B_BAD_VALUE; block = ((cluster - 2) << SuperBlock().BlocksPerClusterShift()) + SuperBlock().FirstDataBlock(); TRACE("Volume::ClusterToBlock() cluster %lu %u %lu: %llu, %lu\n", cluster, diff --git a/src/add-ons/kernel/file_systems/exfat/encodings.cpp b/src/add-ons/kernel/file_systems/exfat/encodings.cpp index 53e5b35b95..09c69c56d8 100644 --- a/src/add-ons/kernel/file_systems/exfat/encodings.cpp +++ b/src/add-ons/kernel/file_systems/exfat/encodings.cpp @@ -106,6 +106,7 @@ _lendian_unicode_to_utf8( int32 dstLimit = *dstLen; int32 srcCount = 0; int32 dstCount = 0; + status_t status = B_ERROR; for (srcCount = 0; srcCount < srcLimit; srcCount += 2) { uint16 *UNICODE = (uint16 *)&src[srcCount]; @@ -119,19 +120,22 @@ _lendian_unicode_to_utf8( u_lendian_to_utf8(UTF8, UNICODE); utf8Len = UTF8 - utf8; - if ((dstCount + utf8Len) > dstLimit) + if ((dstCount + utf8Len) > dstLimit) { + status = B_BUFFER_OVERFLOW; break; + } for (j = 0; j < utf8Len; j++) dst[dstCount + j] = utf8[j]; dstCount += utf8Len; + status = B_OK; } *srcLen = srcCount; *dstLen = dstCount; dst[dstCount] = '\0'; - return ((dstCount > 0) ? B_NO_ERROR : B_ERROR); + return status; } // utf8 to LENDIAN unicode @@ -146,6 +150,7 @@ _utf8_to_lendian_unicode( int32 dstLimit = *dstLen - 1; int32 srcCount = 0; int32 dstCount = 0; + status_t status = B_ERROR; while ((srcCount < srcLimit) && (dstCount < dstLimit)) { uint16 unicode; @@ -157,20 +162,25 @@ _utf8_to_lendian_unicode( break; utf8_to_u_hostendian(UTF8, UNICODE, err_flag); - if(err_flag == 1) + if (err_flag == 1) return EINVAL; unicode = B_HOST_TO_LENDIAN_INT16(unicode); + if ((dstCount + 1) > dstLimit) { + status = B_BUFFER_OVERFLOW; + break; + } dst[dstCount++] = unicode & 0xFF; dst[dstCount++] = unicode >> 8; srcCount += UTF8 - ((uchar *)(src + srcCount)); + status = B_OK; } *srcLen = srcCount; *dstLen = dstCount; - return ((dstCount > 0) ? B_NO_ERROR : B_ERROR); + return status; } diff --git a/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp b/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp index 2d0a6b2b6b..2fd7d2fbbf 100644 --- a/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp @@ -179,7 +179,7 @@ static status_t exfat_get_vnode(fs_volume* _volume, ino_t id, fs_vnode* _node, int* _type, uint32* _flags, bool reenter) { - TRACE("get_vnode %lu\n", id); + TRACE("get_vnode %" B_PRIdINO "\n", id); Volume* volume = (Volume*)_volume->private_volume; Inode* inode = new(std::nothrow) Inode(volume, id); @@ -357,7 +357,7 @@ exfat_lookup(fs_volume* _volume, fs_vnode* _directory, const char* name, return status; } - TRACE("exfat_lookup: ID %d\n", *_vnodeID); + TRACE("exfat_lookup: ID %" B_PRIdINO "\n", *_vnodeID); return get_vnode(volume->FSVolume(), *_vnodeID, NULL); } @@ -526,24 +526,40 @@ exfat_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie, { TRACE("exfat_read_dir\n"); DirectoryIterator* iterator = (DirectoryIterator*)_cookie; - - size_t length = bufferSize; - ino_t id; - status_t status = iterator->GetNext(dirent->d_name, &length, &id); - if (status == B_ENTRY_NOT_FOUND) { - *_num = 0; - return B_OK; - } else if (status != B_OK) - return status; - Volume* volume = (Volume*)_volume->private_volume; - dirent->d_dev = volume->ID(); - dirent->d_ino = id; - dirent->d_reclen = sizeof(struct dirent) + length; - *_num = 1; + + uint32 maxCount = *_num; + uint32 count = 0; + while (count < maxCount && bufferSize > sizeof(struct dirent)) { + ino_t id; + size_t length = bufferSize - sizeof(struct dirent) + 1; + + status_t status = iterator->GetNext(dirent->d_name, &length, &id); + if (status == B_ENTRY_NOT_FOUND) + break; + + if (status == B_BUFFER_OVERFLOW) { + // the remaining name buffer length was too small + if (count == 0) + return B_BUFFER_OVERFLOW; + break; + } + + if (status != B_OK) + return status; + + dirent->d_dev = volume->ID(); + dirent->d_ino = id; + dirent->d_reclen = sizeof(struct dirent) + length; + + bufferSize -= dirent->d_reclen; + dirent = (struct dirent*)((uint8*)dirent + dirent->d_reclen); + count++; + } + + *_num = count; TRACE("exfat_read_dir end\n"); - return B_OK; } From f756b25e8a83e5485162a48ebef70f226baa376d Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Sat, 4 May 2013 18:20:38 +0200 Subject: [PATCH 017/136] DiskProbe: remove superfluous parentheses introduced in a31ac99 --- src/apps/diskprobe/DataEditor.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/diskprobe/DataEditor.cpp b/src/apps/diskprobe/DataEditor.cpp index 72701cfbd6..97539ad9a5 100644 --- a/src/apps/diskprobe/DataEditor.cpp +++ b/src/apps/diskprobe/DataEditor.cpp @@ -265,8 +265,8 @@ void ReplaceChange::Revert(off_t bufferOffset, uint8 *buffer, size_t bufferSize) { // is it in our range? - if ((fOffset - bufferOffset) > (off_t)bufferSize - || (fOffset + (off_t)fSize) < bufferOffset) { + if (fOffset - bufferOffset > (off_t)bufferSize + || fOffset + (off_t)fSize < bufferOffset) { return; } @@ -311,8 +311,8 @@ ReplaceChange::Merge(DataChange *_change) // are the changes adjacent? - if ((change->fOffset + (off_t)change->fSize) != fOffset - && (fOffset + (off_t)fSize) != change->fOffset) + if (change->fOffset + (off_t)change->fSize != fOffset + && fOffset + (off_t)fSize != change->fOffset) return false; // okay, we can try to merge the two changes @@ -564,7 +564,7 @@ DataEditor::Replace(off_t offset, const uint8 *data, size_t length) if (offset >= fSize) return B_BAD_VALUE; - if ((offset + (off_t)length) > fSize) + if (offset + (off_t)length > fSize) length = fSize - offset; if (fNeedsUpdate) { @@ -709,7 +709,7 @@ DataEditor::Save() // don't try to change the file size size_t size = fRealViewSize; - if ((fRealViewOffset + (off_t)fRealViewSize) > (off_t)fSize) + if (fRealViewOffset + (off_t)fRealViewSize > (off_t)fSize) size = fSize - fRealViewOffset; ssize_t bytesWritten; From 82c2deb5b76c5715f74fcb35aea4ceb2c5a77336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 19:50:17 +0200 Subject: [PATCH 018/136] agp_gart: some 64 bit fixes --- .../kernel/bus_managers/agp_gart/agp_gart.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/agp_gart/agp_gart.cpp b/src/add-ons/kernel/bus_managers/agp_gart/agp_gart.cpp index cc43abb9ec..da9234efea 100644 --- a/src/add-ons/kernel/bus_managers/agp_gart/agp_gart.cpp +++ b/src/add-ons/kernel/bus_managers/agp_gart/agp_gart.cpp @@ -248,7 +248,7 @@ check_capabilities(agp_device_info &deviceInfo, uint32 &command) agpStatus = fix_rate_support(agpStatus); } - TRACE("device %u.%u.%u has AGP capabilities %lx\n", deviceInfo.info.bus, + TRACE("device %u.%u.%u has AGP capabilities %" B_PRIx32 "\n", deviceInfo.info.bus, deviceInfo.info.device, deviceInfo.info.function, agpStatus); // block non-supported AGP modes @@ -482,8 +482,8 @@ Aperture::CreateMemory(size_t size, size_t alignment, uint32 flags) return NULL; } - TRACE("create memory %p, base %lx, size %lx, flags %lx\n", memory, - memory->base, memory->size, flags); + TRACE("create memory %p, base %" B_PRIxADDR ", size %" B_PRIxSIZE + ", flags %" B_PRIx32 "\n", memory, memory->base, memory->size, flags); memory->flags = flags; #if defined(__HAIKU__) && !defined(GART_TEST) @@ -852,7 +852,7 @@ Aperture::_Insert(aperture_memory *memory, size_t size, size_t alignment, status_t get_nth_agp_info(uint32 index, agp_info *info) { - TRACE("get_nth_agp_info(index %lu)\n", index); + TRACE("get_nth_agp_info(index %" B_PRIu32 ")\n", index); if (index >= sDeviceCount) return B_BAD_VALUE; @@ -888,7 +888,7 @@ release_agp(void) uint32 set_agp_mode(uint32 command) { - TRACE("set_agp_mode(command %lx)\n", command); + TRACE("set_agp_mode(command %" B_PRIx32 ")\n", command); if ((command & AGP_ENABLE) == 0) { set_pci_mode(); @@ -912,7 +912,7 @@ set_agp_mode(uint32 command) } command = fix_rate_command(command); - TRACE("set AGP command %lx on all capable devices.\n", command); + TRACE("set AGP command %" B_PRIx32 " on all capable devices.\n", command); // The order of programming differs for enabling/disabling AGP mode // (see AGP specification) @@ -1213,7 +1213,7 @@ agp_init(void) sDeviceCount++; } - TRACE("found %ld AGP devices\n", sDeviceCount); + TRACE("found %" B_PRId32 " AGP devices\n", sDeviceCount); // Since there can be custom aperture modules (for memory management only), // we always succeed if we could get the resources we need. From c162f52eaa83ca2cf01f61c4fb6353d76e10caa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 4 May 2013 20:20:33 +0200 Subject: [PATCH 019/136] intel_extreme and radeon_hd: some 64 bit fixes --- .../private/graphics/intel_extreme/AreaKeeper.h | 6 +++--- .../graphics/intel_extreme/intel_extreme.h | 4 ++-- headers/private/graphics/radeon_hd/AreaKeeper.h | 6 +++--- .../accelerants/intel_extreme/accelerant.h | 4 ++-- src/add-ons/accelerants/intel_extreme/memory.cpp | 4 ++-- src/add-ons/accelerants/intel_extreme/mode.cpp | 15 +++++++++------ .../drivers/graphics/intel_extreme/device.cpp | 2 +- .../drivers/graphics/intel_extreme/driver.cpp | 2 +- .../graphics/intel_extreme/intel_extreme.cpp | 2 +- .../intel_extreme/intel_extreme_private.h | 2 +- .../kernel/drivers/graphics/radeon_hd/driver.cpp | 2 +- .../drivers/graphics/radeon_hd/radeon_hd.cpp | 4 ++-- .../graphics/radeon_hd/radeon_hd_private.h | 2 +- 13 files changed, 29 insertions(+), 26 deletions(-) diff --git a/headers/private/graphics/intel_extreme/AreaKeeper.h b/headers/private/graphics/intel_extreme/AreaKeeper.h index 8e17dec24a..d604bb45cb 100644 --- a/headers/private/graphics/intel_extreme/AreaKeeper.h +++ b/headers/private/graphics/intel_extreme/AreaKeeper.h @@ -22,7 +22,7 @@ class AreaKeeper { area_id Create(const char *name, void **_virtualAddress, uint32 spec, size_t size, uint32 lock, uint32 protection); - area_id Map(const char *name, void *physicalAddress, size_t numBytes, + area_id Map(const char *name, addr_t physicalAddress, size_t numBytes, uint32 spec, uint32 protection, void **_virtualAddress); status_t InitCheck() { return fArea < B_OK ? (status_t)fArea : B_OK; } @@ -57,10 +57,10 @@ AreaKeeper::Create(const char *name, void **_virtualAddress, uint32 spec, area_id -AreaKeeper::Map(const char *name, void *physicalAddress, size_t numBytes, +AreaKeeper::Map(const char *name, addr_t physicalAddress, size_t numBytes, uint32 spec, uint32 protection, void **_virtualAddress) { - fArea = map_physical_memory(name, (addr_t)physicalAddress, numBytes, spec, + fArea = map_physical_memory(name, physicalAddress, numBytes, spec, protection, _virtualAddress); return fArea; } diff --git a/headers/private/graphics/intel_extreme/intel_extreme.h b/headers/private/graphics/intel_extreme/intel_extreme.h index f7e7d22d5a..b8e969fba7 100644 --- a/headers/private/graphics/intel_extreme/intel_extreme.h +++ b/headers/private/graphics/intel_extreme/intel_extreme.h @@ -226,13 +226,13 @@ struct intel_allocate_graphics_memory { uint32 size; uint32 alignment; uint32 flags; - uint32 buffer_base; + addr_t buffer_base; }; // free graphics memory struct intel_free_graphics_memory { uint32 magic; - uint32 buffer_base; + addr_t buffer_base; }; //---------------------------------------------------------- diff --git a/headers/private/graphics/radeon_hd/AreaKeeper.h b/headers/private/graphics/radeon_hd/AreaKeeper.h index 8e17dec24a..d604bb45cb 100644 --- a/headers/private/graphics/radeon_hd/AreaKeeper.h +++ b/headers/private/graphics/radeon_hd/AreaKeeper.h @@ -22,7 +22,7 @@ class AreaKeeper { area_id Create(const char *name, void **_virtualAddress, uint32 spec, size_t size, uint32 lock, uint32 protection); - area_id Map(const char *name, void *physicalAddress, size_t numBytes, + area_id Map(const char *name, addr_t physicalAddress, size_t numBytes, uint32 spec, uint32 protection, void **_virtualAddress); status_t InitCheck() { return fArea < B_OK ? (status_t)fArea : B_OK; } @@ -57,10 +57,10 @@ AreaKeeper::Create(const char *name, void **_virtualAddress, uint32 spec, area_id -AreaKeeper::Map(const char *name, void *physicalAddress, size_t numBytes, +AreaKeeper::Map(const char *name, addr_t physicalAddress, size_t numBytes, uint32 spec, uint32 protection, void **_virtualAddress) { - fArea = map_physical_memory(name, (addr_t)physicalAddress, numBytes, spec, + fArea = map_physical_memory(name, physicalAddress, numBytes, spec, protection, _virtualAddress); return fArea; } diff --git a/src/add-ons/accelerants/intel_extreme/accelerant.h b/src/add-ons/accelerants/intel_extreme/accelerant.h index 1f8aa4523c..df5e274859 100644 --- a/src/add-ons/accelerants/intel_extreme/accelerant.h +++ b/src/add-ons/accelerants/intel_extreme/accelerant.h @@ -105,7 +105,7 @@ extern void save_lvds_mode(void); extern status_t create_mode_list(void); // memory.cpp -extern void intel_free_memory(uint32 base); -extern status_t intel_allocate_memory(size_t size, uint32 flags, uint32 &base); +extern void intel_free_memory(addr_t base); +extern status_t intel_allocate_memory(size_t size, uint32 flags, addr_t &base); #endif /* INTEL_EXTREME_ACCELERANT_H */ diff --git a/src/add-ons/accelerants/intel_extreme/memory.cpp b/src/add-ons/accelerants/intel_extreme/memory.cpp index 6ab8422266..731b972b72 100644 --- a/src/add-ons/accelerants/intel_extreme/memory.cpp +++ b/src/add-ons/accelerants/intel_extreme/memory.cpp @@ -27,7 +27,7 @@ void -intel_free_memory(uint32 base) +intel_free_memory(addr_t base) { if (base == 0) return; @@ -42,7 +42,7 @@ intel_free_memory(uint32 base) status_t -intel_allocate_memory(size_t size, uint32 flags, uint32 &base) +intel_allocate_memory(size_t size, uint32 flags, addr_t &base) { intel_allocate_graphics_memory allocMemory; allocMemory.magic = INTEL_PRIVATE_DATA_MAGIC; diff --git a/src/add-ons/accelerants/intel_extreme/mode.cpp b/src/add-ons/accelerants/intel_extreme/mode.cpp index 2727a16df0..4e87f10f78 100644 --- a/src/add-ons/accelerants/intel_extreme/mode.cpp +++ b/src/add-ons/accelerants/intel_extreme/mode.cpp @@ -77,7 +77,7 @@ struct pll_limits { static status_t get_i2c_signals(void* cookie, int* _clock, int* _data) { - uint32 ioRegister = (uint32)cookie; + uint32 ioRegister = (uint32)(addr_t)cookie; uint32 value = read32(ioRegister); *_clock = (value & I2C_CLOCK_VALUE_IN) != 0; @@ -90,7 +90,7 @@ get_i2c_signals(void* cookie, int* _clock, int* _data) static status_t set_i2c_signals(void* cookie, int clock, int data) { - uint32 ioRegister = (uint32)cookie; + uint32 ioRegister = (uint32)(addr_t)cookie; uint32 value; if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_83x)) { @@ -488,17 +488,20 @@ sanitize_display_mode(display_mode& mode) // TODO: verify constraints - these are more or less taken from the // radeon driver! - const display_constraints constraints = { + display_constraints constraints = { // resolution 320, 8192, 200, 4096, // pixel clock gInfo->shared_info->pll_info.min_frequency, gInfo->shared_info->pll_info.max_frequency, // horizontal - {olderCard ? 2 : 1, 0, 8160, 32, 8192, 0, 8192}, + {1, 0, 8160, 32, 8192, 0, 8192}, {1, 1, 4092, 2, 63, 1, 4096} }; + if (olderCard) + constraints.horizontal_timing.resolution = 2; + return sanitize_display_mode(mode, constraints, gInfo->has_edid ? &gInfo->edid_info : NULL); } @@ -563,7 +566,7 @@ status_t create_mode_list(void) { i2c_bus bus; - bus.cookie = (void*)INTEL_I2C_IO_A; + bus.cookie = (void*)(addr_t)INTEL_I2C_IO_A; bus.set_signals = &set_i2c_signals; bus.get_signals = &get_i2c_signals; ddc2_init_timing(&bus); @@ -762,7 +765,7 @@ if (first) { intel_free_memory(sharedInfo.frame_buffer); - uint32 base; + addr_t base; if (intel_allocate_memory(bytesPerRow * target.virtual_height, 0, base) < B_OK) { // oh, how did that happen? Unfortunately, there is no really good way diff --git a/src/add-ons/kernel/drivers/graphics/intel_extreme/device.cpp b/src/add-ons/kernel/drivers/graphics/intel_extreme/device.cpp index 7b95058931..5aa448c08e 100644 --- a/src/add-ons/kernel/drivers/graphics/intel_extreme/device.cpp +++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/device.cpp @@ -231,7 +231,7 @@ device_ioctl(void* data, uint32 op, void* buffer, size_t bufferLength) status_t status = intel_allocate_memory(*info, allocMemory.size, allocMemory.alignment, allocMemory.flags, - (addr_t* )&allocMemory.buffer_base); + &allocMemory.buffer_base); if (status == B_OK) { // copy result #ifdef __HAIKU__ diff --git a/src/add-ons/kernel/drivers/graphics/intel_extreme/driver.cpp b/src/add-ons/kernel/drivers/graphics/intel_extreme/driver.cpp index bfbd21302d..2fa2ff48fc 100644 --- a/src/add-ons/kernel/drivers/graphics/intel_extreme/driver.cpp +++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/driver.cpp @@ -224,7 +224,7 @@ init_driver(void) gDeviceInfo[found]->init_status = B_NO_INIT; gDeviceInfo[found]->id = found; gDeviceInfo[found]->pci = info; - gDeviceInfo[found]->registers = (uint8*)info->u.h0.base_registers[0]; + gDeviceInfo[found]->registers = info->u.h0.base_registers[0]; gDeviceInfo[found]->device_identifier = kSupportedDevices[type].name; gDeviceInfo[found]->device_type = kSupportedDevices[type].type; diff --git a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp index a6a8c81178..8c4912d80d 100644 --- a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp +++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp @@ -239,7 +239,7 @@ intel_extreme_init(intel_info &info) AreaKeeper mmioMapper; info.registers_area = mmioMapper.Map("intel extreme mmio", - (void*)info.pci->u.h0.base_registers[mmioIndex], + (addr_t)info.pci->u.h0.base_registers[mmioIndex], info.pci->u.h0.base_register_sizes[mmioIndex], B_ANY_KERNEL_ADDRESS, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, (void**)&info.registers); diff --git a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme_private.h b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme_private.h index 8df7837870..4735393620 100644 --- a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme_private.h +++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme_private.h @@ -25,7 +25,7 @@ struct intel_info { addr_t aperture_base; aperture_id aperture; - uint8* registers; + addr_t registers; area_id registers_area; struct intel_shared_info* shared_info; diff --git a/src/add-ons/kernel/drivers/graphics/radeon_hd/driver.cpp b/src/add-ons/kernel/drivers/graphics/radeon_hd/driver.cpp index ffb1ddcf46..beb03523be 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon_hd/driver.cpp +++ b/src/add-ons/kernel/drivers/graphics/radeon_hd/driver.cpp @@ -436,7 +436,7 @@ init_driver(void) gDeviceInfo[found]->init_status = B_NO_INIT; gDeviceInfo[found]->id = found; gDeviceInfo[found]->pci = info; - gDeviceInfo[found]->registers = (uint8*)info->u.h0.base_registers[0]; + gDeviceInfo[found]->registers = info->u.h0.base_registers[0]; gDeviceInfo[found]->pciID = kSupportedDevices[type].pciID; gDeviceInfo[found]->deviceName = kSupportedDevices[type].deviceName; gDeviceInfo[found]->chipsetID = kSupportedDevices[type].chipsetID; diff --git a/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp b/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp index 1609f9c308..4d048920f0 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp +++ b/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp @@ -592,7 +592,7 @@ radeon_hd_init(radeon_info &info) // *** Map Memory mapped IO AreaKeeper mmioMapper; info.registers_area = mmioMapper.Map("radeon hd mmio", - (void*)info.pci->u.h0.base_registers[PCI_BAR_MMIO], + info.pci->u.h0.base_registers[PCI_BAR_MMIO], info.pci->u.h0.base_register_sizes[PCI_BAR_MMIO], B_ANY_KERNEL_ADDRESS, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, (void**)&info.registers); @@ -665,7 +665,7 @@ radeon_hd_init(radeon_info &info) // *** Framebuffer mapping AreaKeeper frambufferMapper; info.framebuffer_area = frambufferMapper.Map("radeon hd frame buffer", - (void*)info.pci->u.h0.base_registers[PCI_BAR_FB], + info.pci->u.h0.base_registers[PCI_BAR_FB], info.shared_info->frame_buffer_size * 1024, B_ANY_KERNEL_ADDRESS, B_READ_AREA | B_WRITE_AREA, (void**)&info.shared_info->frame_buffer); diff --git a/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h b/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h index 10135221e8..ad9d2edcb9 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h +++ b/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd_private.h @@ -34,7 +34,7 @@ struct radeon_info { status_t init_status; int32 id; pci_info* pci; - uint8* registers; + addr_t registers; uint8* atom_buffer; // buffer for atombios From 309f473c0fba22e96964b3f4e80c78a540f5efb7 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 4 May 2013 20:17:48 -0400 Subject: [PATCH 020/136] Various minor layout tweaks/improvements to prompt window. --- src/kits/shared/PromptWindow.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/kits/shared/PromptWindow.cpp b/src/kits/shared/PromptWindow.cpp index 53ce2f0956..4eeac83ab1 100644 --- a/src/kits/shared/PromptWindow.cpp +++ b/src/kits/shared/PromptWindow.cpp @@ -30,21 +30,26 @@ PromptWindow::PromptWindow(const char* title, const char* label, BButton* acceptButton = new BButton("Accept", new BMessage(kAcceptInput)); BLayoutBuilder::Group<>(this, B_VERTICAL) + .SetInsets(4.0f, 4.0f, 4.0f, 4.0f) .Add(fInfoView) .Add(fTextControl) .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add(cancelButton) .Add(acceptButton) - .Add(cancelButton); + .End() + .End(); if (info == NULL) fInfoView->Hide(); - fTextControl->TextView()->SetExplicitMinSize(BSize( - fTextControl->TextView()->StringWidth("1234567890"), B_SIZE_UNSET)); + fTextControl->TextView()->SetExplicitMinSize(BSize(200.0, B_SIZE_UNSET)); fTextControl->SetTarget(this); acceptButton->SetTarget(this); cancelButton->SetTarget(this); fTextControl->MakeFocus(true); + + SetDefaultButton(acceptButton); } From 9187efd1a9be8115b5c57a0b6d045d6a27b19317 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 4 May 2013 20:28:46 -0400 Subject: [PATCH 021/136] Clean up context menu building. Even if the inspect action is unavailable, continue building the rest of the actions, since they can apply regardless of the value location. --- .../gui/team_window/VariablesView.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp b/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp index d86684706c..1e1483d08a 100644 --- a/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/VariablesView.cpp @@ -1953,19 +1953,19 @@ VariablesView::_GetContextActionsForNode(ModelNode* node, ContextActionList* actions) { ValueLocation* location = node->NodeChild()->Location(); - - // if the location's stored somewhere other than in memory, - // then we won't be able to inspect it this way. - if (location->PieceAt(0).type != VALUE_PIECE_LOCATION_MEMORY) - return B_OK; - + status_t result = B_OK; BMessage* message = NULL; - status_t result = _AddContextAction("Inspect", MSG_SHOW_INSPECTOR_WINDOW, - actions, message); - if (result != B_OK) - return result; - message->AddUInt64("address", location->PieceAt(0).address); + // only show the Inspect option if the value is in fact located + // in memory. + if (location->PieceAt(0).type == VALUE_PIECE_LOCATION_MEMORY) { + result = _AddContextAction("Inspect", MSG_SHOW_INSPECTOR_WINDOW, + actions, message); + if (result != B_OK) + return result; + message->AddUInt64("address", location->PieceAt(0).address); + } + result = _AddContextAction("Cast as" B_UTF8_ELLIPSIS, MSG_SHOW_TYPECAST_NODE_PROMPT, actions, message); From 69d85497fd4aca0c7b200ab6faea27c28d8e35b1 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 4 May 2013 21:17:47 -0400 Subject: [PATCH 022/136] Fix update issues in BStringColumn. In some cases, BStringColumn wouldn't properly detect that an update was needed, and would consequently fail to truncate a string as needed with a column resize. --- headers/private/interface/ColumnTypes.h | 7 ++++--- src/kits/interface/ColumnTypes.cpp | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/headers/private/interface/ColumnTypes.h b/headers/private/interface/ColumnTypes.h index c9fc5882df..6e581fd7ba 100644 --- a/headers/private/interface/ColumnTypes.h +++ b/headers/private/interface/ColumnTypes.h @@ -60,10 +60,11 @@ class BStringField : public BField void SetString (const char* string); const char* String () const; void SetClippedString (const char* string); + bool HasClippedString () const; const char* ClippedString (); void SetWidth (float); float Width (); - + private: float fWidth; BString fString; @@ -109,7 +110,7 @@ class BDateField : public BField time_t Seconds (); time_t UnixTime (); - private: + private: struct tm fTime; time_t fUnixTime; time_t fSeconds; @@ -235,7 +236,7 @@ class BBitmapColumn : public BTitledColumn virtual int CompareFields (BField* field1, BField* field2); virtual bool AcceptsField (const BField* field) const; }; - + //===================================================================== // Column to display BIntegerField objects as a graph. diff --git a/src/kits/interface/ColumnTypes.cpp b/src/kits/interface/ColumnTypes.cpp index 432476f23e..65ffb99746 100644 --- a/src/kits/interface/ColumnTypes.cpp +++ b/src/kits/interface/ColumnTypes.cpp @@ -159,6 +159,13 @@ BStringField::SetClippedString(const char* val) } +bool +BStringField::HasClippedString() const +{ + return !fClippedString.IsEmpty(); +} + + const char* BStringField::ClippedString() { @@ -182,17 +189,22 @@ BStringColumn::DrawField(BField* _field, BRect rect, BView* parent) { float width = rect.Width() - (2 * kTEXT_MARGIN); BStringField* field = static_cast(_field); - bool clipNeeded = width < field->Width(); + float fieldWidth = field->Width(); + bool updateNeeded = width != fieldWidth; - if (clipNeeded) { + if (updateNeeded) { BString out_string(field->String()); - - parent->TruncateString(&out_string, fTruncate, width + 2); - field->SetClippedString(out_string.String()); + float preferredWidth = parent->StringWidth(out_string.String()); + if (width < preferredWidth) { + parent->TruncateString(&out_string, fTruncate, width + 2); + field->SetClippedString(out_string.String()); + } else + field->SetClippedString(""); field->SetWidth(width); } - DrawString(clipNeeded ? field->ClippedString() : field->String(), parent, rect); + DrawString(field->HasClippedString() ? field->ClippedString() + : field->String(), parent, rect); } From 73eeef0a52f1383c0cc5d0d3370d5ecb9298e29e Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 4 May 2013 21:18:38 -0400 Subject: [PATCH 023/136] Change truncation mode for image/function list views. Since for image/file paths, the most interesting part is generally the filename at the end, and the initial path information is mostly redundant, it makes more sense to truncate at the beginning. --- .../user_interface/gui/team_window/ImageFunctionsView.cpp | 2 +- .../debugger/user_interface/gui/team_window/ImageListView.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp index 9d21acb028..3a096fa7a0 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp @@ -444,7 +444,7 @@ ImageFunctionsView::_Init() // columns fFunctionsTable->AddColumn(new StringTableColumn(0, "File/Function", 300, - 100, 1000, B_TRUNCATE_END, B_ALIGN_LEFT)); + 100, 1000, B_TRUNCATE_BEGINNING, B_ALIGN_LEFT)); fFunctionsTableModel = new FunctionsTableModel(); fFunctionsTable->SetTreeTableModel(fFunctionsTableModel); diff --git a/src/apps/debugger/user_interface/gui/team_window/ImageListView.cpp b/src/apps/debugger/user_interface/gui/team_window/ImageListView.cpp index 1588aefb04..4494fc06e6 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ImageListView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ImageListView.cpp @@ -292,7 +292,7 @@ ImageListView::_Init() fImagesTable->AddColumn(new Int32TableColumn(0, "ID", 40, 20, 1000, B_TRUNCATE_MIDDLE, B_ALIGN_RIGHT)); fImagesTable->AddColumn(new StringTableColumn(1, "Name", 80, 40, 1000, - B_TRUNCATE_END, B_ALIGN_LEFT)); + B_TRUNCATE_BEGINNING, B_ALIGN_LEFT)); fImagesTable->AddTableListener(this); From 447f975c88aa542f41ca119f07af3e94bd87d3b4 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sun, 5 May 2013 08:55:13 -0400 Subject: [PATCH 024/136] Spacing adjustments as suggested by Axel. --- .../user_interface/gui/team_window/WatchPromptWindow.cpp | 2 +- .../user_interface/gui/teams_window/StartTeamWindow.cpp | 2 +- .../debugger/user_interface/gui/teams_window/TeamsWindow.cpp | 3 ++- src/kits/shared/PromptWindow.cpp | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/WatchPromptWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/WatchPromptWindow.cpp index 8464582e1f..34ae3beb88 100644 --- a/src/apps/debugger/user_interface/gui/team_window/WatchPromptWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/WatchPromptWindow.cpp @@ -101,7 +101,7 @@ WatchPromptWindow::_Init() BLayoutItem* labelItem = fTypeField->CreateLabelLayoutItem(); labelItem->View()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); BLayoutBuilder::Group<>(this, B_VERTICAL) - .SetInsets(4.0f, 4.0f, 4.0f, 4.0f) + .SetInsets(B_USE_DEFAULT_SPACING) .AddGroup(B_HORIZONTAL, 4.0f) .Add(fAddressInput) .End() diff --git a/src/apps/debugger/user_interface/gui/teams_window/StartTeamWindow.cpp b/src/apps/debugger/user_interface/gui/teams_window/StartTeamWindow.cpp index bc5216e630..149bacd028 100644 --- a/src/apps/debugger/user_interface/gui/teams_window/StartTeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/teams_window/StartTeamWindow.cpp @@ -73,7 +73,7 @@ StartTeamWindow::_Init() fCancelButton = new BButton("Cancel", new BMessage(B_QUIT_REQUESTED)); BLayoutBuilder::Group<>(this, B_VERTICAL) - .SetInsets(4.0f, 4.0f, 4.0f, 4.0f) + .SetInsets(B_USE_DEFAULT_SPACING) .Add(fGuideText) .AddGroup(B_HORIZONTAL, 4.0f) .Add(fTeamTextControl) diff --git a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp index b26bcd3255..052d63be12 100644 --- a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp +++ b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp @@ -149,7 +149,8 @@ TeamsWindow::_Init() BLayoutBuilder::Group<>(this, B_VERTICAL) .Add(fTeamsListView = new TeamsListView("TeamsList", fCurrentTeam)) .SetInsets(1.0f, 1.0f, 1.0f, 1.0f) - .AddGroup(B_HORIZONTAL, 4.0f) + .AddGroup(B_HORIZONTAL) + .SetInsets(B_USE_DEFAULT_SPACING) .Add(fAttachTeamButton = new BButton("Attach", new BMessage( MSG_DEBUG_THIS_TEAM))) .Add(fCreateTeamButton = new BButton("Start new team" diff --git a/src/kits/shared/PromptWindow.cpp b/src/kits/shared/PromptWindow.cpp index 4eeac83ab1..7e7715b810 100644 --- a/src/kits/shared/PromptWindow.cpp +++ b/src/kits/shared/PromptWindow.cpp @@ -30,7 +30,7 @@ PromptWindow::PromptWindow(const char* title, const char* label, BButton* acceptButton = new BButton("Accept", new BMessage(kAcceptInput)); BLayoutBuilder::Group<>(this, B_VERTICAL) - .SetInsets(4.0f, 4.0f, 4.0f, 4.0f) + .SetInsets(B_USE_DEFAULT_SPACING) .Add(fInfoView) .Add(fTextControl) .AddGroup(B_HORIZONTAL) From f5d67f3f4d5d456a2add0ccf3c13afd36eafd270 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 5 May 2013 18:24:35 +0200 Subject: [PATCH 025/136] intel_gart: Fix build after argument type change. --- src/add-ons/kernel/busses/agp_gart/intel_gart.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/busses/agp_gart/intel_gart.cpp b/src/add-ons/kernel/busses/agp_gart/intel_gart.cpp index 7a358d653b..77c6ff288e 100644 --- a/src/add-ons/kernel/busses/agp_gart/intel_gart.cpp +++ b/src/add-ons/kernel/busses/agp_gart/intel_gart.cpp @@ -385,7 +385,7 @@ intel_map(intel_info &info) AreaKeeper mmioMapper; info.registers_area = mmioMapper.Map("intel GMCH mmio", - (void*)info.display.u.h0.base_registers[mmioIndex], + info.display.u.h0.base_registers[mmioIndex], info.display.u.h0.base_register_sizes[mmioIndex], B_ANY_KERNEL_ADDRESS, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, (void**)&info.registers); if (mmioMapper.InitCheck() < B_OK) { @@ -444,7 +444,7 @@ intel_map(intel_info &info) AreaKeeper gttMapper; info.gtt_area = gttMapper.Map("intel GMCH gtt", - (void*)info.gtt_physical_base, gttSize, B_ANY_KERNEL_ADDRESS, + info.gtt_physical_base, gttSize, B_ANY_KERNEL_ADDRESS, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, (void**)&info.gtt_base); if (gttMapper.InitCheck() < B_OK) { dprintf("intel_gart: could not map GTT!\n"); @@ -467,7 +467,7 @@ intel_map(intel_info &info) AreaKeeper apertureMapper; info.aperture_area = apertureMapper.Map("intel graphics aperture", - (void*)info.aperture_physical_base, info.aperture_size, + info.aperture_physical_base, info.aperture_size, B_ANY_KERNEL_BLOCK_ADDRESS | B_MTR_WC, B_READ_AREA | B_WRITE_AREA, (void**)&info.aperture_base); if (apertureMapper.InitCheck() < B_OK) { @@ -475,7 +475,7 @@ intel_map(intel_info &info) dprintf(DEVICE_NAME ": enabling write combined mode failed.\n"); info.aperture_area = apertureMapper.Map("intel graphics aperture", - (void*)info.aperture_physical_base, info.aperture_size, + info.aperture_physical_base, info.aperture_size, B_ANY_KERNEL_BLOCK_ADDRESS, B_READ_AREA | B_WRITE_AREA, (void**)&info.aperture_base); } From dff48661fd6117d130f05a20d86677e4117bb242 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 5 May 2013 18:25:47 +0200 Subject: [PATCH 026/136] intel_extreme: Remove redundant cast of argument. --- .../kernel/drivers/graphics/intel_extreme/intel_extreme.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp index 8c4912d80d..f4d4f7164a 100644 --- a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp +++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp @@ -239,7 +239,7 @@ intel_extreme_init(intel_info &info) AreaKeeper mmioMapper; info.registers_area = mmioMapper.Map("intel extreme mmio", - (addr_t)info.pci->u.h0.base_registers[mmioIndex], + info.pci->u.h0.base_registers[mmioIndex], info.pci->u.h0.base_register_sizes[mmioIndex], B_ANY_KERNEL_ADDRESS, B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA, (void**)&info.registers); From ddd60371132d5b7007b8c3378b586f8a1d913f6d Mon Sep 17 00:00:00 2001 From: John Scipione Date: Sun, 5 May 2013 13:12:15 -0400 Subject: [PATCH 027/136] Some style fixes in MenuItem --- src/kits/interface/MenuItem.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/kits/interface/MenuItem.cpp b/src/kits/interface/MenuItem.cpp index 98f5e005f2..0b5f211027 100644 --- a/src/kits/interface/MenuItem.cpp +++ b/src/kits/interface/MenuItem.cpp @@ -358,7 +358,7 @@ BMenuItem::Frame() const void -BMenuItem::GetContentSize(float *width, float *height) +BMenuItem::GetContentSize(float* width, float* height) { // TODO: Get rid of this. BMenu should handle this // automatically. Maybe it's not even needed, since our @@ -376,7 +376,7 @@ BMenuItem::GetContentSize(float *width, float *height) void -BMenuItem::TruncateLabel(float maxWidth, char *newLabel) +BMenuItem::TruncateLabel(float maxWidth, char* newLabel) { BFont font; fSuper->GetFont(&font); @@ -406,16 +406,17 @@ BMenuItem::DrawContent() float frameWidth = fBounds.Width(); if (menuPrivate.State() == MENU_STATE_CLOSED) { - float rightMargin, leftMargin; + float leftMargin; + float rightMargin; menuPrivate.GetItemMargins(&leftMargin, NULL, &rightMargin, NULL); - frameWidth = fSuper->Frame().Width() - (rightMargin + leftMargin); + frameWidth = fSuper->Frame().Width() - rightMargin + leftMargin; } - // truncate if needed if (frameWidth >= labelWidth) fSuper->DrawString(fLabel); else { - char *truncatedLabel = new char[strlen(fLabel) + 4]; + // truncate the label to fit + char* truncatedLabel = new char[strlen(fLabel) + 4]; TruncateLabel(frameWidth, truncatedLabel); fSuper->DrawString(truncatedLabel); delete[] truncatedLabel; From 2253368e6aa54138e5cee18af291082da483da46 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sun, 5 May 2013 13:13:07 -0400 Subject: [PATCH 028/136] Implement #8671. Smarter Zoom behavior for TeamsWindow - resize such that the team list view's horizontal scrollbar isn't needed. --- .../gui/teams_window/TeamsWindow.cpp | 18 ++++++++++++++++++ .../gui/teams_window/TeamsWindow.h | 1 + 2 files changed, 19 insertions(+) diff --git a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp index 052d63be12..617a3ef3df 100644 --- a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp +++ b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "MessageCodes.h" @@ -70,6 +71,23 @@ TeamsWindow::Create(SettingsManager* settingsManager) } +void +TeamsWindow::Zoom(BPoint, float, float) +{ + BSize preferredSize = fTeamsListView->PreferredSize(); + ResizeBy(preferredSize.Width() - Bounds().Width(), + 0.0); + + // if the new size would extend us past the screen border, + // move sufficiently to the left to bring us back within the bounds + // + a bit of extra margin so we're not flush against the edge. + BScreen screen; + float offset = screen.Frame().right - Frame().right; + if (offset < 0) + MoveBy(offset - 5.0, 0.0); +} + + void TeamsWindow::MessageReceived(BMessage* message) { diff --git a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.h b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.h index d4f4ebbbcf..b83083e6bf 100644 --- a/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.h +++ b/src/apps/debugger/user_interface/gui/teams_window/TeamsWindow.h @@ -25,6 +25,7 @@ public: static TeamsWindow* Create(SettingsManager* settingsManager); // throws + virtual void Zoom(BPoint origin, float width, float height); virtual void MessageReceived(BMessage* message); virtual bool QuitRequested(); From ab2e15ab8c0b54c6e8631e996566c5a32be14ed5 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sun, 5 May 2013 13:34:07 -0400 Subject: [PATCH 029/136] Use default insets for inspector window as well. --- .../user_interface/gui/inspector_window/InspectorWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp index 5dbb1083aa..ed7ec9afd0 100644 --- a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp +++ b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp @@ -125,7 +125,7 @@ InspectorWindow::_Init() textMenu->AddItem(item); BLayoutBuilder::Group<>(this, B_VERTICAL) - .SetInsets(4.0f, 4.0f, 4.0f, 4.0f) + .SetInsets(B_USE_DEFAULT_SPACING) .AddGroup(B_HORIZONTAL, 4.0f) .Add(fAddressInput = new BTextControl("addrInput", "Target Address:", "", From ec4d0e426d0e022f6acc1aec831cb2c771354356 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 5 May 2013 18:00:04 +0200 Subject: [PATCH 030/136] BMediaNode: Handle port read syscall interrupts by retrying. The syscall might be interrupted, especially in signal heavy applications. In that case we need to retry the read until the timeout runs out. since the timeout is already absolute we don't need to adjust anything. --- src/kits/media/MediaNode.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/kits/media/MediaNode.cpp b/src/kits/media/MediaNode.cpp index beb41e24fb..c4c67fc96a 100644 --- a/src/kits/media/MediaNode.cpp +++ b/src/kits/media/MediaNode.cpp @@ -364,13 +364,23 @@ BMediaNode::WaitForMessage(bigtime_t waitUntil, char data[B_MEDIA_MESSAGE_SIZE]; // about 16 KByte stack used int32 message; - ssize_t size = read_port_etc(ControlPort(), &message, data, sizeof(data), - B_ABSOLUTE_TIMEOUT, waitUntil); - if (size < 0) { + ssize_t size; + while (true) { + size = read_port_etc(ControlPort(), &message, data, + sizeof(data), B_ABSOLUTE_TIMEOUT, waitUntil); + + if (size >= 0) + break; + status_t error = (status_t)size; - if (error != B_TIMED_OUT && error != B_BAD_PORT_ID) + if (error == B_INTERRUPTED) + continue; + + if (error != B_TIMED_OUT && error != B_BAD_PORT_ID) { ERROR("BMediaNode::WaitForMessage: read_port_etc error: %s\n", strerror(error)); + } + return error; } From 5af6169bb2afb3dd70839d2439802ba10999e35c Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 5 May 2013 18:01:12 +0200 Subject: [PATCH 031/136] x86[-64]: Fix arch_cpu_user_strlcpy() for small buffers The case for small buffers was broken, since scasb operates on edi/rdi, not esi/rsi. --- src/system/kernel/arch/x86/32/arch.S | 3 +++ src/system/kernel/arch/x86/64/arch.S | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/system/kernel/arch/x86/32/arch.S b/src/system/kernel/arch/x86/32/arch.S index 90ef56b363..68d7038be8 100644 --- a/src/system/kernel/arch/x86/32/arch.S +++ b/src/system/kernel/arch/x86/32/arch.S @@ -264,9 +264,12 @@ FUNCTION(arch_cpu_user_strlcpy): /* count remaining bytes in src */ .L_user_strlcpy_source_count: not %ecx + # %ecx was 0 and is now max xor %al,%al + movl %esi,%edi repnz scasb + movl %edi,%esi .L_user_strlcpy_source_done: movl %esi,%eax diff --git a/src/system/kernel/arch/x86/64/arch.S b/src/system/kernel/arch/x86/64/arch.S index 3f07b957d2..baf8d09f4e 100644 --- a/src/system/kernel/arch/x86/64/arch.S +++ b/src/system/kernel/arch/x86/64/arch.S @@ -251,9 +251,12 @@ FUNCTION(arch_cpu_user_strlcpy): .L_user_strlcpy_source_count: // Count remaining bytes in src not %rcx + # %rcx was 0 and is now max xor %al, %al + movl %rsi, %rdi repnz scasb + movl %rdi, %rsi .L_user_strlcpy_source_done: // Restore the old fault handler From 1b104893478023f9d694271b701ca1e25c905322 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sun, 5 May 2013 16:08:31 -0400 Subject: [PATCH 032/136] Add listener interface to MemoryView. - When the target address of the memory view changes, an attached listener is now notified. This lets the inspector window's text input keep in sync with the current address when keyboard navigating the memory view. --- .../gui/inspector_window/InspectorWindow.cpp | 23 ++++++++++----- .../gui/inspector_window/InspectorWindow.h | 11 ++++++-- .../gui/inspector_window/MemoryView.cpp | 28 +++++++++++++++---- .../gui/inspector_window/MemoryView.h | 21 ++++++++++++-- 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp index ed7ec9afd0..e3917f88fe 100644 --- a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp +++ b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2011, Rene Gollent, rene@gollent.com. All rights reserved. + * Copyright 2011-2013, Rene Gollent, rene@gollent.com. All rights reserved. * Distributed under the terms of the MIT License. */ @@ -156,7 +156,7 @@ InspectorWindow::_Init() int32 targetEndian = fTeam->GetArchitecture()->IsBigEndian() ? EndianModeBigEndian : EndianModeLittleEndian; - scrollView->SetTarget(fMemoryView = MemoryView::Create(fTeam)); + scrollView->SetTarget(fMemoryView = MemoryView::Create(fTeam, this)); fAddressInput->SetTarget(this); fPreviousBlockButton->SetTarget(this); @@ -221,6 +221,7 @@ InspectorWindow::MessageReceived(BMessage* msg) } if (addressValid) { + fCurrentAddress = address; if (fCurrentBlock != NULL && !fCurrentBlock->Contains(address)) { fCurrentBlock->ReleaseReference(); @@ -231,11 +232,6 @@ InspectorWindow::MessageReceived(BMessage* msg) fListener->InspectRequested(address, this); else fMemoryView->SetTargetAddress(fCurrentBlock, address); - - fCurrentAddress = address; - BString computedAddress; - computedAddress.SetToFormat("0x%" B_PRIx64, address); - fAddressInput->SetText(computedAddress.String()); } break; } @@ -289,6 +285,19 @@ InspectorWindow::MemoryBlockRetrieved(TeamMemoryBlock* block) } +void +InspectorWindow::TargetAddressChanged(target_addr_t address) +{ + AutoLocker lock(this); + if (lock.IsLocked()) { + fCurrentAddress = address; + BString computedAddress; + computedAddress.SetToFormat("0x%" B_PRIx64, address); + fAddressInput->SetText(computedAddress.String()); + } +} + + status_t InspectorWindow::LoadSettings(const GuiTeamUiSettings& settings) { diff --git a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h index a145e1899c..320e344d9f 100644 --- a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h +++ b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h @@ -1,5 +1,5 @@ /* - * Copyright 2011, Rene Gollent, rene@gollent.com. All rights reserved. + * Copyright 2011-2013, Rene Gollent, rene@gollent.com. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef INSPECTOR_WINDOW_H @@ -8,6 +8,7 @@ #include +#include "MemoryView.h" #include "TeamMemoryBlock.h" #include "Types.h" @@ -17,13 +18,13 @@ class BMenuField; class BMessenger; class BTextControl; class GuiTeamUiSettings; -class MemoryView; class Team; class UserInterfaceListener; class InspectorWindow : public BWindow, - public TeamMemoryBlock::Listener { + public TeamMemoryBlock::Listener, + public MemoryView::Listener { public: InspectorWindow(::Team* team, UserInterfaceListener* listener, @@ -38,8 +39,12 @@ public: virtual void MessageReceived(BMessage* message); virtual bool QuitRequested(); + // TeamMemoryBlock::Listener virtual void MemoryBlockRetrieved(TeamMemoryBlock* block); + // MemoryView::Listener + virtual void TargetAddressChanged(target_addr_t address); + status_t LoadSettings( const GuiTeamUiSettings& settings); status_t SaveSettings( diff --git a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp index fe30580295..a59e96760e 100644 --- a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp +++ b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2011, Rene Gollent, rene@gollent.com. All rights reserved. + * Copyright 2011-2013, Rene Gollent, rene@gollent.com. All rights reserved. * Distributed under the terms of the MIT License. */ @@ -26,7 +26,7 @@ enum { }; -MemoryView::MemoryView(::Team* team) +MemoryView::MemoryView(::Team* team, Listener* listener) : BView("memoryView", B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE | B_SUBPIXEL_PRECISE), @@ -38,7 +38,8 @@ MemoryView::MemoryView(::Team* team) fTextCharsPerLine(0), fHexBlocksPerLine(0), fHexMode(HexMode8BitInt), - fTextMode(TextModeASCII) + fTextMode(TextModeASCII), + fListener(listener) { Architecture* architecture = team->GetArchitecture(); fTargetAddressSize = architecture->AddressSize() * 2; @@ -56,9 +57,9 @@ MemoryView::~MemoryView() /*static */ MemoryView* -MemoryView::Create(::Team* team) +MemoryView::Create(::Team* team, Listener* listener) { - MemoryView* self = new MemoryView(team); + MemoryView* self = new MemoryView(team, listener); try { self->_Init(); @@ -85,6 +86,13 @@ MemoryView::SetTargetAddress(TeamMemoryBlock* block, target_addr_t address) } +void +MemoryView::UnsetListener() +{ + fListener = NULL; +} + + void MemoryView::AttachedToWindow() { @@ -329,6 +337,8 @@ MemoryView::MessageReceived(BMessage* message) _RecalcScrollBars(); ScrollToSelection(); Invalidate(); + if (fListener != NULL) + fListener->TargetAddressChanged(fTargetAddress); break; } case MSG_SET_HEX_MODE: @@ -546,3 +556,11 @@ MemoryView::_GetNextHexBlock(char* buffer, int32 bufferSize, } } } + + +//#pragma mark - Listener + + +MemoryView::Listener::~Listener() +{ +} diff --git a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.h b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.h index 9f0dba6e4e..ca10a25c48 100644 --- a/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.h +++ b/src/apps/debugger/user_interface/gui/inspector_window/MemoryView.h @@ -1,5 +1,5 @@ /* - * Copyright 2011, Rene Gollent, rene@gollent.com. All rights reserved. + * Copyright 2011-2013, Rene Gollent, rene@gollent.com. All rights reserved. * Distributed under the terms of the MIT License. */ @@ -46,15 +46,19 @@ class TeamMemoryBlock; class MemoryView : public BView { public: - MemoryView(::Team* team); + class Listener; + + MemoryView(::Team* team, Listener* listener); virtual ~MemoryView(); - static MemoryView* Create(::Team* team); + static MemoryView* Create(::Team* team, Listener* listener); // throws void SetTargetAddress(TeamMemoryBlock* block, target_addr_t address); + void UnsetListener(); + virtual void AttachedToWindow(); virtual void Draw(BRect rect); virtual void FrameResized(float width, float height); @@ -83,6 +87,17 @@ private: int32 fCurrentEndianMode; int32 fHexMode; int32 fTextMode; + Listener* fListener; }; + +class MemoryView::Listener { +public: + virtual ~Listener(); + + virtual void TargetAddressChanged(target_addr_t address) + = 0; +}; + + #endif // MEMORY_VIEW_H From 1b17f7ab00ea450c315029358c4eedb166f47c79 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sun, 5 May 2013 16:57:51 -0400 Subject: [PATCH 033/136] Fix x86-64 build. --- src/system/kernel/arch/x86/64/arch.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/system/kernel/arch/x86/64/arch.S b/src/system/kernel/arch/x86/64/arch.S index baf8d09f4e..3f9b6d1e48 100644 --- a/src/system/kernel/arch/x86/64/arch.S +++ b/src/system/kernel/arch/x86/64/arch.S @@ -253,10 +253,10 @@ FUNCTION(arch_cpu_user_strlcpy): not %rcx # %rcx was 0 and is now max xor %al, %al - movl %rsi, %rdi + movq %rsi, %rdi repnz scasb - movl %rdi, %rsi + movq %rdi, %rsi .L_user_strlcpy_source_done: // Restore the old fault handler From c0f529c38b1a11e44766dcf8691a8ca1face85ee Mon Sep 17 00:00:00 2001 From: Matt Madia Date: Sun, 5 May 2013 17:15:17 -0400 Subject: [PATCH 034/136] VL-Gothic fonts is updated to version 20130422. Fixes #9706. --- .../data/fonts/ttfonts/VL-Gothic-Regular.ttf | Bin 4107984 -> 4107480 bytes .../data/fonts/ttfonts/VL-PGothic-Regular.ttf | Bin 4168132 -> 4167628 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/data/system/data/fonts/ttfonts/VL-Gothic-Regular.ttf b/data/system/data/fonts/ttfonts/VL-Gothic-Regular.ttf index 46e1b9063e6cabc9780c467630d705bee84500d8..d2bb546d21a68900220016e015094b1be78e3702 100644 GIT binary patch delta 87402 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 u02Zo~bj1NYx< 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
P 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 Hy1D-kv-#?8 delta 89814 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

(-9h}h^Z3`#5+t&L3OAI% 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 rc;k#!3L-WEJb+IfE6-FWr_Q+J;aD`WylInQf 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

`_>``D{PAH=edz2c z!*kCK&u$B?PtNz_Ul!j#7QXl}y%s-aZlTwIN@q%k>A^8q(Hrw|i{K+UYXsf!P)lFe zhR_H%7lAhfq@x&Ncqx11LfagVdFyoB?5#qTFmCi=&+3K(LzU}gPxh+B387(@2!Fv* z**Ij!yFutl_?Y4SPVFymRU7 z%<)FHB?1@tSj3f@lHtu2TKt#}W)u-@IF~6d7W#tk#0d(_I?r zQhi5PwG=f7mp2LoBg8GQ#rGSGQUHOUDJP#ZlotE7r}34ht!WNz6*O=ZWdL`57sBa;BUY z9ws|7)V!F85=->5@xH=so_DRDFGj|~?4qet3rDZWQsn!h6Oszk&0&swml__5;q6C4 z-&*62=g<#wQk%RwNkPkJJS`;?4^j@!~|hCMUGehwc0Hq8lQs#s#cRNgo6m*6;qQ|L=v z92V2p?anp3_p8$*xUOc^DrGhCo`LGX@Iu9rWy`HnFE!M9-dy@w){_@BEPE>J^QE4z zg}8>%XA?J1DV!%X?y7PwnUa58yo#$*~>hv5T@!`{BvWkl$?$R&`O zrT>Us9LXBTX>3dUeH!!1@lztWKKmA=WQ4oDClued{2t646!QK{{F0X7ip*$ekZjTQ zF?~YHA0wI3)x~MS#lio6>GH<_CN(p>wQY2kapUuri`(0;_+vEV4!VEH_c3p7DRj6! zApEiU?$C2t5Ffs13g*_<2yZyUlwbImdEwl!!|5TXhNpOwAzVQbUWd}pn+h?EB|^Nb ziT(-m#wosxYrN;|*xJ>+IW_MfgtF)C^tm0!>r~elqy-m_#G@Vwh|eH~wxBqava z3n8Be{OU28GA2(PDfOMi_b*HeM*I8cg@)E7dN$S>iadY2drfNRV9b@)j**1>m%JGp znUX*LTOr-^=~)OSZ}+y3{$kvC`f|gnv2=-_za@IG*pgh779Q%&l^B>RvGDv32{L;# zC&?xUb0linzj7ocLau-N#bLSK=TapYj=doK>N{KkjO1VA$>@Z4oAtiC@aBuX`J(wa zpPLtBd2uX)_nwK~Sl+?YF+|A7?0eVO65;-L>^`=ze7)n!90;8@o(TVI1b;SwpJP&M zCT+UZ6cd|c82{Vf#qrTDb8wP%vf-x5**Q7c3zNgb4VLiQYezQ}a$JL>>mDepxtc#8 zR8)H}p1BWTmhz|;Pg@VVhK(;%;NplZ08FuL;QBKofXI3g8UfUF8?evyu7hib*Qzo%gZlnjgPBb(VAU9$Med} zET2lgr4x#Zqb#5Bri?eQg#}lKg#A?hAktIOhjT8 zGhpkn1vlVk_9QaG!t{40XS_olo7CQ=?8^}M>~X>>&h)cqtv9&j9O#pnQ5KZGmwF20 ze8z&yzM_Wl(Qe;Jg$)j4*Hqb+I6fpjewy7nzv5`pXj@gJIV7@rNz5E){P<^IUs`&x zV$BSzuqOGXrbgQ=g~kbC!KTbC{|PxWX4I62HAs526=x#DZyph+rDs|T*AKn&^!QkH zw&yqJgD&3^A-N(mGRK&cCm5@Qpy)F~vhd8xn`XMJD|7O%Tyo_tr;ixVuef$}MNDmU zbWBujOj(2)mpB%Rrl!Qjm;D+NR%r=+bw&=yjAzphb5M1#S%|K9?6Ej~T1sv@!_;X7 zuK48Cu_!e$R*m#Vse6-4)~2ULXKQk0Y;ARNT)W{cHZN|@;IcUVN&yk48#Hgfm zxfAbezy@X;SECaf(ABr++6i%eBd-VK1kq6vxQ4t3xX}0BbC!6{6HX_3Hvd~1#d6Dn z|EJ8!Xrpghdb}$<-YHctlkM~8H#9b;7=r$%oJya$Iwi&VA88WL?Umu?=YJog zdqT%o1&0Z76;D51@mt7|KV(oae94)Jxjyy)Byk&gi}P#x*e3gX*63`^``@;ZzMZ#5 zB)ZS8A&2SrZDnjx(L;*(&y?W*FCtFSwv#?%e2T zCZd1))sUMvw!^spxW#xLDx0{4KL`K4wfrwTOPV?4+204|uCU;$5Q~uD9hlL;@kwJz zL#7k|r~RhCMf{Je%kvj;+c} zX7JB`jKKSPj&Jia9myG)W3PL7LeUfCp~TtcU7BK)Gu_uR_UhB?Z+d@|BfNp4*GD#H zR!->f^GkCEr-j!i_nyL{F-|BPrqlV{jum^}J~VY1K|dD;8`|C}^oZRq1R zIoLccqtd_FKWF`m7w7BOx8IzdBZPbYnwu46Nlwi!3=3;1h@K)xx+*Kv%x1r&!eDb{ zdwjw);c{oYt`C3ka^%xK5k5#g^RV$@V=(u&v(X9zo4)NY1=-!{zn{Tgf9@MYSI%g* zVED>&NA{%YljZ6u%@@Yp)OnG-X6-tk&%QO4m#_34ADgSy8B<0l8uCY9^J22$Bf;)+ zE$@toC@GY3i}Rehd0}PIQ)=fwH9o8?HMGLy_q-yt6}vXR`rzxzB3WJ{_UB<) zP{Z>%8yDLD6~mMY!J{_{;p-ZT4ATnt?(@EO6H1Cbm7c@PmMP1Y)tvfYVwZ#GqLhPz z$@7fo6TX%1D>bU4LBpBfN8Xq(r1wp|J~L9t>^qPal@)C*wN0Fq;n^cxojaqUEq2wM z>1*N^PMY*$pE*4$$?>(dsibmFdHLFDYEnsBSy5I=l3L-Z{ZXD7BBn%?`}hgV_|hUy zuuK;Ew57VfLa=y_54WdB-K_^l@(}VKp&9fwAoTTq91#)rpQopHCih7VQISi(`u{mH ze-?5UzTT#*dU9&5I8|J)+;CH^VaEU0QCZozxN^ff+svlXUxa-(bmqVG2G=bUjnADI zHTYDd*R~Iste=3n-UHsdCo2(=eg2aJ(|vvZRnBq?xsN|SAXqXZa(xrW2bt!!OwB2- zsw+J|b92Sa>TP@W7>>QQoy}1;-()r~sJk|6S!KgycgDR_TdMAP;)#a0jMD6~<~$%khZ_c#F~To>#6i`&%Ib++QPxl6M0V>e)!1G>y`VBg*sl>cI;&L z8}r@AZc=^vgwMrrH(i*q(bl6O1Oy1V@^AoG~*o zt~$w?Gc)}HgSDtmD{%=mg^6W3GmJChWBDP7?}f+)!^VdmD!<@-(IHso%qjDnPEWmj z$M|_OM!yn9=2gW;uUT5yc46_9)cUf~pM{s)?N!_Ne;1Rnyfd{^2ru_+n4RNO;lpTq zb9r|+7us-qUG$=AyD!XKWv_4+c~_bD)ps%X%l~D4os(J&t4rQLB+T>NC(JAJ zq)aQQZOcC|hS`Co)n~H<(HXNg2WG@}1$hKvWZlxL$6hUe^wArcG5CGeVR*(((V`{J zkN-L8Lo|INBDgV>VI?!d>-ly0d>Py~^}7g*JDltPKQjaxQ`tpKchI?tDJ|jamNs4(HMyk7=E%)&6aoeRh@>DxiJx^!LCOYk^q5d} z$@su}|M53OM&!op@fF5~z;NIC(qdC^cy3uvXn?6-OL0ud6@IC+{UUh^-grZh^Gh~X zl{EDK^izLBN!7*@!CY84QM85^$H`VpL69XqC%q=CD!18wd7z0I7N4nB!5p(FD!XP) ziBG`WaVdU$Noo*Ej5kZs^xOO+*ZQu!z*KH4wk3*svi(CxUP^w}FR6;XHRP(kknPbY zo6Y}v32tZ5*NQggwZJ5RH{jzb_{WIP_rFAZ-Z4w@^G!|nerzH#%JCneUteffbhMkF z4jMZ`y+NPwsqmzyzwVADl9-qn&>;973i$CKJQmaHtDY?WJ=|jwH8LVJG&LpB)726v zMhDj!#QzfYJ)fMN;GJ{}vN`F5QX$S8>U(ka{kXv}7V#B@Cl{qwhll+h@goiNA!~^q2Xh@hsxx{M1F#5 z3a0lRdO1;zO815X^!&$i&1192yLY7brM;4vGiCIavx{T#f*I*ra^|Eo!;#1C|EFi@ zvB!K$N-A9?1^FL}%PS`Fr((JIVSYi0%W-yHl)o`Ib@swhk1(=+3*XD;JDr}_7GZen z+tF`##G3HCE%jsZ`s}kGX~`8FeW4lAQGN4#qeF~*B7I-n7m$AT(}O~J-o_078pk-% z&u>zCv3K+?n{?g{m(I9yTg;rPp8r$XcL26kUTy2WSC(X1wq@;YZOKEj_LjA5S>BHA zIF7TNz2hWg51c^;A&fv0g@h3{Ns|C!h)u#MyNm**loeJPg_agtpwZ<&@0FZ{uk`=^ zUq-QPE5Yx%?|aU3p7We@|JE}kPVnq54&&!}r4=oq$(o90#?P}kyrJ%f=59;E;&sK` z=-%basXr}W{>M}#oazY9y{gWr+$7{v4D|fAk>(RmrS87lFudvVS(#AU>uwGPRVyzR zeoGn8muE1A>npN&yBDFc1hRL7fTe0EFM?b->Bh`e(jx4T{FLrSZzsMK;xSR-do?zQf@eL}}LZ&x=; zdpc5{mN{on*lc8PlDfko=cAN0jYe)fkV-TKz1QEStrEr^fk5EK+`GFJHzEM0_kegs zL-WKQaJg_FVzvP)7PNB#-6qZwF(XS0k1&gZB@@__Nlf%x;KTtaCE>|7lb3o)?}s1O zsv@yobyJyaq`yBwN%JcZ++gqhq>9!W zSAx&QLQNBR0r0XYJML590!F4 z1^g0^!$ofZ9Zo;6DhvcxDAJAKS_%XVpK&#dzlWj>V8*|IqL}`?R_-)P2+e8<& zb^5wnP{h~VH6;wyIjYeH3fdq@zpyq6mJ2aEd)#3$jh4{X@m{#jF>dko z|6LnF`NDG=r$@%ku+8p%ps=8GitY=^#b2r;_TG0T+~;d*SF5j`(?0eqzf!Ig8Jc8p z79Jt3P}QAV&_xvLTRyK_1WF+Z-uL*}j^${Worg3H)=;=$fGeR&UGE?q&P`|qgVhU&#dF3)mT?PfJg(4Pfh$Ar!Hu@uc zHgmvlwfDtK;)B{oO@>IwGd#Z<)KeE-*d-tu)6ZR@2c3n9?R#m>V z1CvcaoJ=j{B-q?8twnj?ki9M9Xv{>%kEb*zb{luzI?|GHwzQV?*#cHt_F& zjQj$#6&wwE>&oYedpNw&a+S)GBwg~V(o)`hR;41<9CO9jbfS;uD+0DO>9tBY*IzHN z>R&>#S||14tU#JCJpGZqkvilaAM0@o1}D`oZN9IrqpiM^$TfAPPQ4olYPd}tx#Ge5 zw+`%EV;w;%RNAyO|4nMoq*^FE@*R6qv+F&HL~AIC%G8T*skGOn`ZNFh%^ve*x6JNq z_KZ)UgeTPOh01U4ji^%R4wW+Gblpo;Odj)>ss@k#r9eG zuMSVNO}PmTB2T^*xi9O;5W6zJr&fAq#-@5$y)*2ydLOn;>2iz*dBhChl4rD1yxws8 zOhC2i>A$Rb>F(WU*>mTl?pAMmCrWzKZSI~2#tL4TW7Gk3c!P8^N^{wD^jWsHoS*71B%D;pZ)MxN~9fcs3RZ}M$I%Dm2LEB{8^z?lVJ!wY< ztv-}S#?&FSqM6!^Mw?OPs(ICSKF{?yQ`EN;;_)kDvCC7bD-sE+{@9gpN#=C4d%80y z?MSvbTl406R8seIY}2OPJGU#PC2ef*Q4c^jhaZYJSaQ<}+ZRisaAEtxrVb0;$Ki#Q z0rZ9w?I^s2e5!EDp#(mzPaz*g|D%E9KN>o~?UNIpLu!q`CXQTMDGzBa3Z%2^TdJ)J zo!!um)Gtk%)QM7^GiKx;3(SrUhe+DL-CsX9W=|1oMOBL58)b6eO6s$7FB2$5)cC1n z+axPatBe_&zKuX_CdWM|;1vlko*~@+&4~_pB&c!sUTxidl=gqv{dI)>G3tpnzf%TM zxwn-LkDnd1{_;y?Nv9dPisQ=ibh{3G`cn||_^=IB^d_h+QZ}^M!9;s^I_6?YFGx)3 z-EbjD0D6iB*p}?(6H4{yb--Bsu?Op7Z|^2Nf2A&=eL9z3^hw)5r@fu=GulrrK>Ir` zx~OSY(?#ifpCb-FcQ1AMs{YvG#jy}b(f_*eyidn#N@RR#YENK(EJh8}58q4vSj_(t zBK>{_ln!M--%g$Y^(ZuY?5OxonXC9t)v8cxfP;FSOw*^dfljy!#geIv`B{%f@6VnI zsa4W3iVf!n0O<-@nyxB)r$+CzQ*T#Cb>BEmb>;!bwlq<%2x${Wk{LaUHdCWx&#tE= z{H_WS;$*qidb<K+K+!`$nOjR3&BuWqm)KSwF0x6~I2uix%zQVorIA zNFUs(8Tq_Y5qqpqUFCJF3yu~L9gax2tV65*q}kP5%x+unI)S`?Pv@1jm9mBG{D3y5 z{}D>K=0RAU#b|GglI*rUH{5W8Pf@uGN+b65wut%3{kf87_P^;E82{js!g7$W(Y&B7 z;#(sfJ~VeO8p!lD59FS*sT)P3T!seZ8xN3b=pC{ZOH^2FilYb=s7!_UaIU!uyawzi zh_+tLdSF#EKu(l2?WpDbuT9#e#4|SR89FAJGHxX{^@npO+yNW8)WVmZda1MaL zCE0I(ua;*Y`-i%82meQPj{l=Z8ErQF{4gzsw~nQppkicTj-sHm0f!0jPmIwqTuR6y z+&Z=nr|q<#Fq;4$0yfCr^s-t8sndlDY_Yq;UtKR^PHMUJ9(4D8H#HBlbt>J(KOuso ze#l>8)VU`+hwK63ng=M=ncHrgDOM-_vNW69*LnQ-!Gl!ov}w)5w@tfsc=$DY!tPF? z+!q0Th!YGH*sB#&6^W<#}`b2M`-5EnLBj; z>YUE6U9f6sOo~r}Kf$$s+}Y3vYn_Dg5702;0waMX`F6q!%+8o7{ah8gP=N;gNH+-p zEnGZ**~`~ywWI%2oVYxveL(&k>{N`EXt_`Kp19Sm=|x0MtN^ODlRVq{K^T;}n7b z#x@u_oL@chI7oXMCQ*W``x~sA(kO|_^ZO8gb!UX=3_ne!mZEtmLdBm(kto$ly_Lz| zzjWzRnj0ThHqG=qrs^&b_Ph>DzP*TQ^4sFDrb?m=uL+ck_h@fiVjvj;2x#~m1!$=| z1M_sSG4aK+6zZed=nrc3C@pixdsKMtqygB$jJ_Aew^x}?rmTppu2}h57a|vw%g1Hv zldaWtjv>wSJZaDkjYRhLn!7VPvtp$V{jLj@Q~&7t+ux|>g$s$NlF4n0*R)JP%;qkv zduWNb&kYWzqh8O7{VlOzyC?3N+$Qx?PxYbo@rLo&q7rILp>K5$^5qulbl*$`)jkiT z!??*NeNGL5iLrvbdnM!CvZ^p`jL#o^2J0{xJ_f-hKtj+S6JHKo!GP^377-ZCVaQfk zJ5FVAanFobZi1Im__s`>#hnY0!)w6a6*om<`IrOQHdg6waS_Q`vu0(|OJ0=J2s6l4 zQALt&UisC#GVd=*rS&04K;p`KXmSL=5PMWy-chKGq9T-&A8A4f(;vTYsv zFS_!|$CfXD>&KC#$b~}TXw(zCD7p+_!YPtFh_=GNRaeKzUAI{`O=I%{ z0KOF}J|yUjq_D?LjKU75Ne1CqnGRFxQ0K^gc!f^VjF(;owgM^ACn#pEUP{i8RCB2% z=v__zOp7QPp ze(FJ2Q;+AaJFJ^tXDWjv;s`A|PJm+tCJ$WAv_gmnvUvrBN}w3BC!Xa-M%iMxW{|Q9 zi&+E-JRjs-yyXuDf zfg8VT+ZPJzvYyK*#TVPCyU_MSM|;pd_%DAF>8bZy(R~y_WbzMo5Fa9sIVj}1!b7d0 z2@76+dBKEG>rmLvLNDMJxHE;WH|i%`tIKt<^dq$mr9cYd%j5$L)K`UJurr_JY<1$h$AG1Y&hQF zlSmrk@rHQAZNVnXrK8OC+Yh&XL4D`)%$Xdk^;TE6nu4{%hNUZ=9`?cQ{C{;KF7?kZ z>gwU9(qhqy#mT@5o5RlMqfS|ik8k9%*hCw_f(>Fnr_E(xkP1Gwl-+c2| z@Vt4mcG_&sTr%RVDQ8BQyf_L49F@F#QtSF_(R+C@Ruf!QVS-h~ecy|@-Ye~n$$Ib#BTlw|h^ z1=7*`%gVbNL_|mart)&l_sTzZq79&ajFBuZnK$}%Z*)ui_;HP5pgv@5Dl3oM0_tdQZ|}X?+k5o-66*3TvQVzOUH?0FEddp+qvZ9F z56#E!MdvzC;1qE+gh!gm%AT5|myA{*J$(P1!C{AD$OoT_?<%T|3S629%kK)Pp2SxJ z2Nexy>6PUb{L8sg>#(bV&H3#~pkb2Hanoy5%81`;Q!I|#E8povn|sjaPUsP~*W24Q zYSFaHnAK|^ZOoWWJ+0xs9e}zOs z;m%zP+cpo@m+K96;simaGQH!XQh9o?vNR(0n(c)P$z<`MO`9oEtxg4u^6J@rM$^ni z)<EMUQw9q!j})B{TvfbjeV zXof4nKXuUT;zryV0QLe$twC-Ofnee4xyz0%S5m;l;MeJB4VwYJYw-DnkYjsk)531Y zujvo?Zeiy`eGBM&jILqZ!1nRFN5R>{?!mYV&VY+1D}88FdKpl^niu_6F_ZiYb%PB$LkGM4f4X@g1w>xW*@;HltZhV9|B1NCg9FVz=_x!EO zC|1bjkt+BR2Ra}m#Exle^towk3^$7*v8)A?-%GYZ?5>6x4jx+hh?7dXO%zk>*f#j| z6wnYBgEkOw-td`&`rtXsV$Cal8w+X)@Dg@(5y`{fq}4cucY+r-V9gxlq)|jd3o~2* zx0q)5;a!GeV;Ql)n`r1kzPy86HPq9Cw882y`E~1k?Zho#qZMbLL@TJ@5-&!oPPqawOYRBJnzEHwxu}si(dIrTvDa(;*jgQbOqjLw(JFPApg^ z5-0af7D}Tep|=F1ZoS*=@tEDi4Jt&2j=ZZffA)jjz$yK!wwPveArc!CRTvLtNN|07vZqk*8SH}zaMdWONyuBTZ z6QI`J{*6ID`X4&tqRYY?v=HSAA*`VLCl+)g8TEPhPfVsq=SbJJS?4;o>`bp-5)9;r zoKrQgl}n=@=;v{E){PpLeA107mQ~0GGxg0~TB@>M92GmLKSxcZ%?S>-HeSAL6=%i9GlB(ctJdYj zpBYxzrtv_Ga0DQAL5wg^tTQhHu(gu0ma&ns8P-ehhGO>u-VFaA;5vKeXM?h?==#7# z3Sr;TSh^U|{{u>A&-`GJjQ%e$+9mU$E-EiR`>J2a9<6 zzryKk|-Pj#=a zT|MspQ?>J3Jeh4_R#lJ>Z3Lx}Qr*cg{DW^ROzH%BzO60R8fzny$e zgOO_#o1Ph0jTiL@EDDQM>H&yPWK6*eVk`vLauH))_7umY%O1YS#>{qaF>$*}eo0jo zMNx&|=kkp)T3&#K5G!$$ZGoB+f?I-MFCHVUFtZLH*}q^{THcg_imdnt$*hI{^x@rFxLa~(NvHZ6!{Nq z4d6g@nDWUk%lbrR0Agr&2@oO6pXh;EI~cTq7lum>O9oYjP^|OfYAqX{w1n}3oe)71 znHa43!3SGA$=+8#_+SgQLm))|etP&~Nx)_7lutxm8a)qv*7J6|DU|NZR`wx{mDHy{*!Wbs*!9)&+X5(xvrnxshL^DD>*$r2^+ zzWcxqi6~hUbjy@(w_Jvo|8Io+40>-IyWae+Yge(0DlupihMg`RnO zG6POUU^~<6g+3MF3*aS|-FtOzFOzQhgO?C*z?p!u2SR<7kHkqeJTY}5gp=UI`7}Nj z^a})U_hHEsc^`tBL;D@KGY!UIL;K-dnT;Ow;0M%6-0c*YO@>AyQM7JXt$fz$(^Ts8 zX*7`vpyy_to;vmP>9eP&OgVj;P*8!l-$u_-fm$q`FG}n|Y~NVL1=YPNk`l3tz4D(h znT?zbw8|5R4a-NLxbth>P3)!o#+#if_6SH-O(E87$i8xa-faHCF4RCr=!>+X6Hfzk zKmZP9Pc0Y80gC{&kR7?kT&+MC6M=`9OmCPyk2*;>Uak^#3~seQGd=(E+3cBy6I0qS zy246Y3D#I;(c@-OHu_K*XB3VfWXe@IqT^jgpE>|XItfgtBJoASlbE2N15FkfdC<2g zk;(SXX>nQ_T*J;Zw;Wy5ZJ##0rAjO^=TElW3QQCbQG&Ketmo?fTI$~}YNUlw>UC@E zX-OJtF^D5|>_x{|thgZ4 z&A#@HRFvEEu6a-(EPm<)TlCY98Rw@^(~`{{pp|+9igx#!N5;Ru5TH zhVFBx!Y!_+{G*`3HuVziY8mJ3+4i&F4-cd1?a;LVW4%uH2j*nlO^-f>7Uio=vMCD| z-!-NX)NeUbK7ASEpb3Pb8s|lUhGSn(an$BOf{XXj zOY}Y}$N|%UpL0L|)%K%Q4F#4iLk72n5omWt0mt>f=DgkRcwqjT=LXRRwDjK1hrcOoE(6i92`KQdB%PyOf2{yT$ zsdw_#)sh*zu(rrzY@J?I8JSz>xQ0>_T0mvgJh8d1k|RR@!=N9+5VPxxW&!#GS9@~# zgyk<1Ef<DYHK0Wq^Fj*%svKk74KO9!SSwf>7vj1JotCkoxf&k}8jE2eA-H15 z4>7Qm~K|OoEB6tehuV5Ztd?y|gmJD%-zQS#GSLUcF(BVZ#k%@;2>0 zH<$B$Cz?tUiomzy5Q*j^V@9xw=~6G+-KO5WIeQ%bx|iA&QpOz|k-*$&t+2dR6LrR| zWS};rwQ{&1Q`}l9xaOKFKJ}-V7L_y-L{OhV7dvw7NtXLgHP=EudW;N$__|PeP6ML? z3VH%#Zdh1BLr*K=q174|0ZB4_qGNa>pI?H{1KXS({<}py`W^`C_zsOWx@If$$_>#D zjYh!da+&0tU0+f0y_t)`OWGx-8Ow~zCYhE@wDh9y&YbC_zV7(=;|?V3?2?!9L@a_R zZz^ZP_!6`w1u7Q+QbQP|U6Pn@7$Ls@Em4>ccU&vcFu zAW;vcCItC!2*JVw2Rd%;IB*Q>yV10Nx?;0t#a!r-hK6@zu1Le-!!WTUhKJMT&pM{M zTz_t)AMbc}xH2_4SElyKi%X!E0Rr8hep@?U{q3 ze=g_<5)Huzss3oK?4mSu2P-7((mSr=q&p*tM5HI&xYleDz6-T(c)}Db>OgE~ELPCg zzkRMD*e2XI+Sm(%2`kH5laROYBnV`i4{qK}33h&7UeStLi$w*)_uqe?Gk#gS_M(0s zG-6>6-U3~TMT`rO5OcG1n-Bwp&Uj@wiUV%~7x4dqc;7#zRz8Y1?k_S61IC5_*JNSL zFeIy(0Vsc+d9OFd%SuaF*KV&&q+E%Fv)kFY)NJO9BBDx3k+WYq`fC(?zSp2&A`a`(15xWQzv7{lZh*A$N`!Ec|?`{a<_b* zQN(=Um7m&CvkJSe=3sv!ZZJ?6qs^O9hq>m@BO^ck)bUex(dF`aI_jzrv!c8H{klVk z>P~hwX^jR8y2Vdz){EOXtMQ1XT>PTC4+Nu?;E`W~vQia2784WGxI_pp3zv_)Zp`Ij z0zzzHyM<$lG6}9`Eu8Sx;c^95S^b$ z%+J3A;2+2BI&^1K(Uqj`+$oGNO;R8&5p?sz|6BPmtTo!P~bhQ`GboR=Vb<$Ch6e15q zAlTLP2-FL{Iz3(QuB^~2^f0C7ePS1N234ti<^*!9rCg<1fe5`#)iU;?O{G;zEj6~* z8ec_+%WimdsFfHAKd+O>-OH%I6<-j$(#s|bh0d_x4JQTIFFcr1WX_>$zC)K*1 zJU#a6E%dC$&>YM zo_2Cjspnn)n&s&%b=MHJxR~EOg9e~wOOK9xLQM-C!Xhb>k^HfVIyJ$H2WB9?11VnJ z5?}jh6ADx63x!fY|M(--w&{s_RQGf4$vf-&?$q%ZHdw$bq^Ov<=!i_~f!1dtd z9r|T1_t4*3^nc)MTj5 zb*`;l*?k*Tjz}sG&ojt39P_k{sHqPT58ar_#NdNEvTa)$RX{TT46iKSF{3W%aTKz7 zs98jDHos&jI=C=Nl@=FgY@6D!XnYN5!Sc~U2G1+3l9AK*+Fom~9z#tRj>u?&@fh0~ zmofG+4q|tbETT%S(Y1kKqt%>oStgcBYBN&*-k9QEL zS{LaE)GFipWVoiWx~3r-v4l)fAS3R&TrLy;&A;%_p(BDS<{Kg*yC+JG)<+r{IqPBD z%2IDR2-t6>tBd#o7pjXmhS3tDVhn@9J~UE<{8bDqhIZ)V&vLy?SUs7o+HI4L0@yZ4 za8=3=VfkEL5zIrpPo-U7ldV zth&xFpY_LRt+uhExl}T%qcci1eLDZ5lAVaZK(Ju_nauRw#RAFD`)<G4AU>U#6_s`pP(ye z3a&c>Q<%ykYKb@EsqI^=kjd;~lGuMwsX(HylbfnyNu}2-)rKcJJvE*>??RglkscB; z`E&Ly3CAuTzD1?csKhYF)etrtx}2?xgli_S*`f-yT^DH=^&Q(vkugT@n{VufS}z;& zS=_C!EwY89;B0m=u7GRtE8Y5FZ*1eLtTx)994#m^Fnd%qJZ(?_J3waupM-ym-47P| zLD>g3Blsj1F7boEqKm|^{UF4$*ccr_9SFE4FZR!LSHDQaqr3XYr*vkWV^Q|@Lp+&% zoP27dprTwDAC~tyM&-O4k4}iruF+a_&SX-nXJ4_ojL(nP`di`is@djFLWSrWYP$g4jeKi-;|l%!zl%^+Gtl9v-J6G5m?za_ybe6DWb7`QEKt ze=*~dL`Ku83Vy1ku3)TfTrRo``KTAJ(BS@c7*A4cUuR+>k0dbX7piPxbDYHq865BV zahDu=M8*`b;<1{B^{sQ{(02D6X#*BNTqJu7xed*>09jD%T>%&e`_^38r?gfY`#dlj z*Z?TY^8#twSnTs(7vNv^wWpM}(dT~p8mSz*0IHP>IZ~|{Da^_ynN~z7OsbZze;~r! z`Q_p}6#@~enfe!ac|<7?)l8$_hn#eCeB=K8nH@XUuivpFvwwdS=c)Ac`>tA$*#Oe* zsy7Xg#Guvn8<1ZIxZ`#wK%C)X& zm~l{82i^Q9NF6AH3PYMf{Fj}2s$5bA`bC&A10=TIl07v)B2`K;cE`LnaR?Fl-yrh+ z_kSc3KfL!|{$Tdi*Bc~Fe{r?VbWiJ~|2)%8$SEJ%KwYvs7Ml~97L87e^gQo$NfK3j zvp}AT$3w9L54#c_&ddS&&leEmXGUaeZf2$93Z!K+@b7gO8HTvD7)lXq!L5KlIM;ZZ zePzTUfuV%p7_e&x*HLun1&Ki;!bA{UER1j9?-hT{cEAOs3&-%?3MQ17!Hs|?$Ae=0 z5{+5=N)6#kZ~> zKi)cPcAFh$4KTa9tm)l{OgAgW_cCpuU1_a%?>RCSeM@(P*4e z@34#ieSy8u3nG;!(iy39ghOtUY?BE}%Purk>UpP}WClbbqt<1rZHSO$(h_zVR;VKO zRZIe^^y53KT2t%_hfO^^PwOcuStewO!Ys4V$b-7SsAfBpxW4=XbLR#Hj<4&K1v{Sr zJI7#}&SYp8VgOT5t1_}x16&w?0Y;?lQV4qZ0^rL4A0_AaM=_{kr%^B>I1?BXa-917 zXnX#-wxhUeF{9cRGb-JF*-)3Y)?X8L)jJ}A-u4-4Gi;ivotI8%suH4^yJ zBs;tFb!Ep@**9Kq5KJj-Ec9B3@1G$g-oNP1I~VPb&hymk^j2P3V};nLF;%hhRjPqj3qrwPTv$c!ejAUco#>-%ngjkgwyuja)Z!j^J9h__!R4bTgqWZ1JGUh7aK z3fY@qS}1K`gaM;t#0IkUlCIt+o~_A)t{m@rx*bh%wHF8Ob` zB4@n|a9h-p`e%CfT6B2D+&RiQ&vm`oTP8^~+Pooo{&#Ti1BcjgPBOjvnwD6g(;ab4 zZ1GStTrT2{1&PFhpEuu&)t#9{>)hZ_QvfBhBVRgHx$+X{8c$6*+&rZ)n76?FjRUG5 z59h_q5gylf6%ZT@sFsB?p5bSvkkn}J>M#>ERWH(t7Y`R2_vEnm5|*}uAI)23z1b|>t$ z{$Tsk>C>t2rcb}`R5J;(+PE!wmO$<5kWLG%y8tGVduh`WkT3lFVZr)vg{S7obGJT zpi$+a;U{jX!`cc+j(vJzRA8ij8&zr=RVcJ7;4MA!aOuSU!-tosHNtsq%}qmp$lf_< z)OeQ6@v0Ot@57cUac|>ayRMqqR?#y5Rzc^Qs*$%6)W-sGtjV0Jk|B3uU5!fKK5;=$ zvwQzUqq^eY3a3`vH?g6kw<8f-w`0kT&fJn4U3MlhuPuASEv|{g#09w@Z*c{rQ0|r$ zJJU6g^w&a)FbI|5Wd*%J_SKi2wxEgbQZH!2Ex*u&<54ic%7cfc=aK;>WC9$=0_unE zQO~}2d7X?v3$xT{L^9y_^A&#OJrZe9B0;Z$O7x-j%jR1(S{2M~@BHZ{?x$aoWEDS? zygh)&w)0pl(1~aC`AgnNI&5ge;db=Xm`Hr7cG3OnTd(;EKeD>ZT#D?*PB+i}jff^iNiU(Kqtu1)wP)%&iwqV+w@c*3~PR)jBoaT$Q$2e*eED(tto2ekJI( zA+0yC7#^p6K~Q6lP}g2@9rYI6d8b&-Uy2sl6CG%|~L zvo+321uNMQc=1?vTw}&#*}JAy&S)=lQ*R2yZ-RxV%tgUyPiKAwn=>|reGHZg+2y9J z8>X-WgR{{62U1@Kx63&FtCg=C7&kNSfQUfXzMvgu+<2!%OM6P%jNm+QJT7!^(To+Y z{NWPULTBXciN|4Jx5GV)x&uu-(?3yu`Y`X?(!;0a6Z_9V4gHQe9&?k*K)tqk^A2?N z{NZ7`w6%yj7L97G-|ZP@p!cf+SC~!DmVT7 zC^XUq88^YNc?^D0aMgwE0mr0YfHUto0Ehh^{p)9)Yq-L!qSwjI4v%-TA&rJz0)dte z0EK@hJItEzBHYutfID6tDtu|qE&Zo`PHzdE~O6u>uu_|4# zt83niFFdxGS1~#q;8plVRk~Px%v4nwME8}WS=A1|8ami%?p^z_E;}VrzT`3d=loFYFz_o?PMXlI@DB`nyTAb)3L?8K67fz zqD8Iy+ZHXN1f6Ir^}<(Qp^E)T1l5o4VOG=SNE=Gm!a5j6#^;L5{1tUFuC)T*7VkvX zanQ(J!7u0eQ3+mm^ecEk?)q%ocdJ%q5D{@#iS?4OMCYqEGnu}AqbVqr$(p3%Dy6~_ zEaydQD#}AG@~Ig?X+>YfVg=k_qz+w*y7RRYpsk%#!K+LX)A}z3HFwJRlm7=f zIlry{k_R5h9lFJR$pTjhAP45WF|03+OM%LU$BfSjzO;bi=~G4@Ld=6nv+;2@@hD*X z;+#bx*ny-EsKJX3Ge(2|&Ft@}+nGUPkz#hr)3aJH*EERuYnuf;QJwZEx-~QYlG-ifpMPm!AUTj4k66C`OEN7wtPZRD10lKe5I;VRIZI1Q5X~BO9wGAe)g}0z?CyqdQR~rC5%p3 zFurk{70NhxhAPZtLD^m3xB*9uEeO^Q#1i!JV#ibH;LHBy7Ot!~p`{8hY+oxfNi_#H zj^A>Vd}0svWzR&3OzE(qc(bxhQLAmJ-)JT?jGq^C%3H$|)SPB&0jF&8xQ2AEHDPG* z$KB|@Wy`2{moI-CG!v-{*O-jYx@6bfOelr#+!k>*L}$g)@wk!tAULO%zU`Y)*EVh5 zcC4f@8{6i)CZ{L1)z?jKnTlQp%|+p^Z;-0|P3svqsOQ4;>EA%85YbcF>0vmq>#<@F z&&*`_b>i&wkVKrly9eTcG%2Z+;rthl1Jr59YBivl5F1doXPU>70Uk|K0(m{HB7$q( zhYpGalxnc6tM#^YclSh>u8CcW%wbtuN#k7o@^t$;tsz4XKSH5eK@4x=f~5ZMmD)d2Y3W2we`hEqDO5 z2EyWf?PlPGBRqf#hXb7=R&pxEE*euE~p&#c2=C1 z4-CYUp~nNk=0I~~B6{(WP%{68FW?V9v~rWxR^#AE1!0j~D9P=))f0Huj(eA{rF#dN zpnzTkNFUGqqR}2>Hy9QGhR*_K#eo)dkh&Hxj9|kPhG7$lG5P?v=`H*a!$P`V0Ppsh z;QjC}d{t;p49r$cRB7{K*?9PYvu@N z#cEo2a@eDHqc`4Uv7cMo-z4jsExK6LI1erUl)f`f{)^v>2Hd~tuGaC9V39k#Fr41t zrM~r~3?UxhAgW@$7)|xI?B9Rvq_#ofCe-KI;m4(Eyv0F5#|P<931pRH#Bs`lLCcA0IWKU z%X?mHaBHBI{9bW6GruWhl?A2LqhW2>kjNUHq*+kOybbNXLGn17ga#dseGcll+wJjq z-O<@2=!!*i{^)sX$^ntVpywn?xKG(pe9BZ7(a2Ur%h+?MZysW?13_Z`a-(eU7_z=c z{qC{Px}vRb-G}<~#BrywJ#CD|+UILm^@>a4AV(A*jm3@!wdmr;#w!lOL$ic_gwJ4_ z^bFD`5<7l(nK$>l%X}t|Mg#cgRfrE*-aP-DtHiBrJ3-5mePohPnI$Is1l73qaAAlj zyr$E1%!6e+uk%T>Q^P*qGz@cb?dTjj!mqKLMd?ymgSZqS>JMn;`uXdp_s`peR=+?D{&dDHYhO%0^4d8Y-B_t9fp&miR-F z0a~|x`*v#O5dHWSCdjXmwo9@XU+JJA&$ZE z1{=W>N@f4?UA(U`m?yUXH^lx%r@q;oB!jwYo{oBHWZJa3$hZ=K{5?>eUNyUW_7Y@V zGKX5yiDdgv{Q|d-!FHk~uL6Xcf(~GGe=s=7I}nWmbe}Zo-0S=za>3dCX!hVBV@Fo) z&t=ttn@da;ASJws`~%c;aUVhz-J)y&hGjW+cnqwG+QZ0Zd*1YGt8g?a#1xEYApB+@ ziSummO&^K>C{zIorxmFG?DWh1=IpC)`sGu5)W4zrP=ORvRC~TD|Dr*%{BEvPCR#F+ zIeU=g@t`?Rq%_y?Dne4J8X+D}DNl%$mfG@)pjH!NvzlU)mx=bQ=%2Z7pjEC~xK^f& zbVMT}=|3JKjTR#{Ej#gfzdDLUPRYMcinrb;ShEQYv z>1_Sye&r5>pPwfdS|COFlYH%z`#9l?~)84mN9YSR*Y7P9mr$%K&Zpj zAP~}8ByP|R7l@*~k`gwHD@ z)xI*$Opk{z&Od_=P5L8x%}bEWHOi&?K%rw*iv{h*Iu)tXh*f-{M@4;ArAzDZf2d4* zo6gKc6S+I8>O$}g=c?)=Ypz7@?5>9+4(C0xyWh7z4AHUo?MYiPmLzI=nm9KNf*!G`Ie-#`L@7L2dj00azs+OaK4? delta 89716 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

>T4 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%0A4K}Go8(W!Bo}5${;YyuU6PAxY*F*y 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 hQ0n=6Q%)w~OC^?B;sAU{4+O?8REssC$Q| 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

W>@TDx|Wy%@gw;Rb9J;uVB@W-apZ@ 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 T-{j!RR_8a{3qOdlD;xg;&)D)} From a1566b06b7b53d14fa53c169b0989925c54fd69d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 6 May 2013 21:45:00 +0200 Subject: [PATCH 035/136] bfs: removed kernel_cpp.h's new operator. * This fixes bug #9715 from the POV of BFS, ie. the new operator seems to call the constructor on a NULL object on failure. --- src/add-ons/kernel/file_systems/bfs/Inode.cpp | 14 +++++++------ .../kernel/file_systems/bfs/Journal.cpp | 4 ++-- src/add-ons/kernel/file_systems/bfs/Query.cpp | 20 +++++++++---------- .../file_systems/bfs/system_dependencies.h | 1 - 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/add-ons/kernel/file_systems/bfs/Inode.cpp b/src/add-ons/kernel/file_systems/bfs/Inode.cpp index c5e92c2949..d33970a614 100644 --- a/src/add-ons/kernel/file_systems/bfs/Inode.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Inode.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2012, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2001-2013, Axel Dörfler, axeld@pinc-software.de. * This file may be used under the terms of the MIT License. */ @@ -206,7 +206,8 @@ InodeAllocator::New(block_run* parentRun, mode_t mode, block_run& run, } run = fRun; - fInode = new Inode(volume, *fTransaction, volume->ToVnode(run), mode, run); + fInode = new(std::nothrow) Inode(volume, *fTransaction, + volume->ToVnode(run), mode, run); if (fInode == NULL) RETURN_ERROR(B_NO_MEMORY); @@ -235,7 +236,8 @@ InodeAllocator::CreateTree() if ((fInode->Mode() & S_INDEX_TYPES) == 0) fInode->Node().mode |= HOST_ENDIAN_TO_BFS_INT32(S_STR_INDEX); - BPlusTree* tree = fInode->fTree = new BPlusTree(*fTransaction, fInode); + BPlusTree* tree = fInode->fTree + = new(std::nothrow) BPlusTree(*fTransaction, fInode); if (tree == NULL || tree->InitCheck() < B_OK) return B_ERROR; @@ -347,7 +349,7 @@ Inode::Inode(Volume* volume, ino_t id) fOldLastModified = LastModified(); if (IsContainer()) - fTree = new BPlusTree(this); + fTree = new(std::nothrow) BPlusTree(this); if (NeedsFileCache()) { SetFileCache(file_cache_create(fVolume->ID(), ID(), Size())); SetMap(file_map_create(volume->ID(), ID(), Size())); @@ -2881,7 +2883,7 @@ AttributeIterator::GetNext(char* name, size_t* _length, uint32* _type, BPlusTree* tree = fAttributes->Tree(); if (tree == NULL - || (fIterator = new TreeIterator(tree)) == NULL) { + || (fIterator = new(std::nothrow) TreeIterator(tree)) == NULL) { FATAL(("could not get tree in AttributeIterator::GetNext(ino_t" " = %" B_PRIdINO ",name = \"%s\")\n", fInode->ID(), name)); return B_ENTRY_NOT_FOUND; @@ -2892,7 +2894,7 @@ AttributeIterator::GetNext(char* name, size_t* _length, uint32* _type, ino_t id; status_t status = fIterator->GetNextEntry(name, &length, B_FILE_NAME_LENGTH, &id); - if (status < B_OK) + if (status != B_OK) return status; Vnode vnode(volume, id); diff --git a/src/add-ons/kernel/file_systems/bfs/Journal.cpp b/src/add-ons/kernel/file_systems/bfs/Journal.cpp index fa62b52afe..bac5a4342a 100644 --- a/src/add-ons/kernel/file_systems/bfs/Journal.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Journal.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2010, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2001-2013, Axel Dörfler, axeld@pinc-software.de. * This file may be used under the terms of the MIT License. */ @@ -853,7 +853,7 @@ Journal::_WriteTransactionToLog() free(vecs); - LogEntry* logEntry = new LogEntry(this, fVolume->LogEnd(), + LogEntry* logEntry = new(std::nothrow) LogEntry(this, fVolume->LogEnd(), runArrays.LogEntryLength()); if (logEntry == NULL) { FATAL(("no memory to allocate log entries!")); diff --git a/src/add-ons/kernel/file_systems/bfs/Query.cpp b/src/add-ons/kernel/file_systems/bfs/Query.cpp index d6f213cd14..a5e593af34 100644 --- a/src/add-ons/kernel/file_systems/bfs/Query.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Query.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2009, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2001-2013, Axel Dörfler, axeld@pinc-software.de. * Copyright 2010, Clemens Zeidler * This file may be used under the terms of the MIT License. */ @@ -971,7 +971,7 @@ Equation::PrepareQuery(Volume* /*volume*/, Index& index, if (tree == NULL) return B_ERROR; - *iterator = new TreeIterator(tree); + *iterator = new(std::nothrow) TreeIterator(tree); if (*iterator == NULL) return B_NO_MEMORY; @@ -1249,11 +1249,11 @@ Term* Operator::Copy() const { if (fEquation != NULL) { - Equation* equation = new Equation(*fEquation); + Equation* equation = new(std::nothrow) Equation(*fEquation); if (equation == NULL) return NULL; - Term* term = new Term(equation); + Term* term = new(std::nothrow) Term(equation); if (term == NULL) delete equation; @@ -1270,7 +1270,7 @@ Operator::Copy() const return NULL; } - Term* term = new Term(left, fOp, right); + Term* term = new(std::nothrow) Term(left, fOp, right); if (term == NULL) { delete left; delete right; @@ -1393,7 +1393,7 @@ Expression::ParseEquation(char** expr) return term; } - Equation* equation = new Equation(expr); + Equation* equation = new(std::nothrow) Equation(expr); if (equation == NULL || equation->InitCheck() < B_OK) { delete equation; return NULL; @@ -1413,8 +1413,8 @@ Expression::ParseAnd(char** expr) Term* right = ParseAnd(expr); Term* newParent = NULL; - if (right == NULL - || (newParent = new Operator(left, OP_AND, right)) == NULL) { + if (right == NULL || (newParent = new(std::nothrow) Operator(left, + OP_AND, right)) == NULL) { delete left; delete right; @@ -1438,8 +1438,8 @@ Expression::ParseOr(char** expr) Term* right = ParseAnd(expr); Term* newParent = NULL; - if (right == NULL - || (newParent = new Operator(left, OP_OR, right)) == NULL) { + if (right == NULL || (newParent = new(std::nothrow) Operator(left, + OP_OR, right)) == NULL) { delete left; delete right; diff --git a/src/add-ons/kernel/file_systems/bfs/system_dependencies.h b/src/add-ons/kernel/file_systems/bfs/system_dependencies.h index 6e8989670a..aa0773d1aa 100644 --- a/src/add-ons/kernel/file_systems/bfs/system_dependencies.h +++ b/src/add-ons/kernel/file_systems/bfs/system_dependencies.h @@ -18,7 +18,6 @@ #include #include #include -#include #include #include From 267a780ab5ba7e7774dc6b4a6d391ab3cfbb9f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 6 May 2013 18:42:13 +0200 Subject: [PATCH 036/136] btrfs: fixes 64 bit warnings --- .../kernel/file_systems/btrfs/Attribute.cpp | 4 +- .../kernel/file_systems/btrfs/BPlusTree.cpp | 30 ++++++------ .../kernel/file_systems/btrfs/Chunk.cpp | 18 +++---- .../file_systems/btrfs/DirectoryIterator.cpp | 4 +- .../kernel/file_systems/btrfs/Inode.cpp | 31 ++++++------ .../kernel/file_systems/btrfs/Volume.cpp | 48 +++++++++++-------- .../file_systems/btrfs/kernel_interface.cpp | 8 ++-- 7 files changed, 77 insertions(+), 66 deletions(-) diff --git a/src/add-ons/kernel/file_systems/btrfs/Attribute.cpp b/src/add-ons/kernel/file_systems/btrfs/Attribute.cpp index abc0fc51f0..d6be6d3fcb 100644 --- a/src/add-ons/kernel/file_systems/btrfs/Attribute.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/Attribute.cpp @@ -162,8 +162,8 @@ Attribute::_Lookup(const char* name, size_t nameLength, status_t status = fInode->GetVolume()->FSTree()->FindExact(key, (void**)&entries, &length); if (status != B_OK) { - TRACE("AttributeIterator::Lookup(): Couldn't find entry with hash %lu " - "\"%s\"\n", hash, name); + TRACE("AttributeIterator::Lookup(): Couldn't find entry with hash %" + B_PRIu32 " \"%s\"\n", hash, name); return status; } diff --git a/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp b/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp index 04609624af..0f1bf0115d 100644 --- a/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/BPlusTree.cpp @@ -89,14 +89,14 @@ status_t BPlusTree::_Find(struct btrfs_key &key, void** _value, size_t* _size, bplustree_traversing type) { - TRACE("Find() objectid %lld type %d offset %lld \n", key.ObjectID(), - key.Type(), key.Offset()); + TRACE("Find() objectid %" B_PRId64 " type %d offset %" B_PRId64 " \n", + key.ObjectID(), key.Type(), key.Offset()); btrfs_stream *stream = fStream; CachedBlock cached(fVolume); fsblock_t physical; if (stream == NULL) { if (fVolume->FindBlock(fRootBlock, physical) != B_OK) { - ERROR("Find() unmapped block %lld\n", fRootBlock); + ERROR("Find() unmapped block %" B_PRId64 "\n", fRootBlock); return B_ERROR; } stream = (btrfs_stream *)cached.SetTo(physical); @@ -107,19 +107,19 @@ BPlusTree::_Find(struct btrfs_key &key, void** _value, size_t* _size, uint32 i = 1; for (; i < stream->header.ItemCount(); i++) { int32 comp = _CompareKeys(stream->index[i].key, key); - TRACE("Find() found index %ld at %lld comp %ld\n", i, - stream->index[i].BlockNum(), comp); + TRACE("Find() found index %" B_PRIu32 " at %" B_PRId64 " comp %" + B_PRId32 "\n", i, stream->index[i].BlockNum(), comp); if (comp < 0) continue; if (comp > 0 || type == BPLUSTREE_BACKWARD) break; } - TRACE("Find() getting index %ld at %lld\n", i - 1, + TRACE("Find() getting index %" B_PRIu32 " at %" B_PRId64 "\n", i - 1, stream->index[i - 1].BlockNum()); if (fVolume->FindBlock(stream->index[i - 1].BlockNum(), physical) != B_OK) { - ERROR("Find() unmapped block %lld\n", + ERROR("Find() unmapped block %" B_PRId64 "\n", stream->index[i - 1].BlockNum()); return B_ERROR; } @@ -128,18 +128,19 @@ BPlusTree::_Find(struct btrfs_key &key, void** _value, size_t* _size, uint32 i; #ifdef TRACE_BTRFS - TRACE("Find() dump count %ld\n", stream->header.ItemCount()); + TRACE("Find() dump count %" B_PRId32 "\n", stream->header.ItemCount()); for (i = 0; i < stream->header.ItemCount(); i++) { int32 comp = _CompareKeys(key, stream->entries[i].key); - TRACE("Find() dump %ld %ld offset %lld comp %ld\n", - stream->entries[i].Offset(), + TRACE("Find() dump %" B_PRIu32 " %" B_PRIu32 " offset %" B_PRId64 + " comp %" B_PRId32 "\n", stream->entries[i].Offset(), stream->entries[i].Size(), stream->entries[i].key.Offset(), comp); } #endif for (i = 0; i < stream->header.ItemCount(); i++) { int32 comp = _CompareKeys(key, stream->entries[i].key); - TRACE("Find() found %ld %ld oid %lld type %d offset %lld comp %ld\n", + TRACE("Find() found %" B_PRIu32 " %" B_PRIu32 " oid %" B_PRId64 + " type %d offset %" B_PRId64 " comp %" B_PRId32 "\n", stream->entries[i].Offset(), stream->entries[i].Size(), stream->entries[i].key.ObjectID(), stream->entries[i].key.Type(), stream->entries[i].key.Offset(), comp); @@ -163,8 +164,8 @@ BPlusTree::_Find(struct btrfs_key &key, void** _value, size_t* _size, if (i < stream->header.ItemCount() && stream->entries[i].key.Type() == key.Type()) { - TRACE("Find() found %ld %ld\n", stream->entries[i].Offset(), - stream->entries[i].Size()); + TRACE("Find() found %" B_PRIu32 " %" B_PRIu32 "\n", + stream->entries[i].Offset(), stream->entries[i].Size()); if (_value != NULL) { *_value = malloc(stream->entries[i].Size()); memcpy(*_value, ((uint8 *)&stream->entries[0] @@ -178,7 +179,8 @@ BPlusTree::_Find(struct btrfs_key &key, void** _value, size_t* _size, } - TRACE("Find() not found %lld %lld\n", key.Offset(), key.ObjectID()); + TRACE("Find() not found %" B_PRId64 " %" B_PRId64 "\n", key.Offset(), + key.ObjectID()); return B_ENTRY_NOT_FOUND; } diff --git a/src/add-ons/kernel/file_systems/btrfs/Chunk.cpp b/src/add-ons/kernel/file_systems/btrfs/Chunk.cpp index d9b39e21a7..95d82a4b5b 100644 --- a/src/add-ons/kernel/file_systems/btrfs/Chunk.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/Chunk.cpp @@ -35,13 +35,15 @@ Chunk::Chunk(struct btrfs_chunk* chunk, fsblock_t offset) memcpy(fChunk, chunk, sizeof(struct btrfs_chunk) + chunk->StripeCount() * sizeof(struct btrfs_stripe)); - TRACE("chunk[0] length %llu owner %llu stripe_length %llu type %llu " - "stripe_count %u sub_stripes %u sector_size %lu\n", chunk->Length(), - chunk->Owner(), chunk->StripeLength(), chunk->Type(), - chunk->StripeCount(), chunk->SubStripes(), chunk->SectorSize()); + TRACE("chunk[0] length %" B_PRIu64 " owner %" B_PRIu64 " stripe_length %" + B_PRIu64 " type %" B_PRIu64 " stripe_count %u sub_stripes %u " + "sector_size %" B_PRIu32 "\n", chunk->Length(), chunk->Owner(), + chunk->StripeLength(), chunk->Type(), chunk->StripeCount(), + chunk->SubStripes(), chunk->SectorSize()); for(int32 i = 0; i < chunk->StripeCount(); i++) { - TRACE("chunk.stripe[%ld].physical %lld deviceid %lld\n", i, - chunk->stripes[i].Offset(), chunk->stripes[i].DeviceID()); + TRACE("chunk.stripe[%" B_PRId32 "].physical %" B_PRId64 " deviceid %" + B_PRId64 "\n", i, chunk->stripes[i].Offset(), + chunk->stripes[i].DeviceID()); } } @@ -66,8 +68,8 @@ Chunk::FindBlock(off_t logical, off_t &physical) if (fChunk == NULL) return B_NO_INIT; - if (logical < fChunkOffset - || logical > (fChunkOffset + fChunk->Length())) + if (logical < (off_t)fChunkOffset + || logical > (off_t)(fChunkOffset + fChunk->Length())) return B_BAD_VALUE; // only one stripe diff --git a/src/add-ons/kernel/file_systems/btrfs/DirectoryIterator.cpp b/src/add-ons/kernel/file_systems/btrfs/DirectoryIterator.cpp index 6ea65249bd..01eb9884eb 100644 --- a/src/add-ons/kernel/file_systems/btrfs/DirectoryIterator.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/DirectoryIterator.cpp @@ -132,8 +132,8 @@ DirectoryIterator::Lookup(const char* name, size_t nameLength, ino_t* _id) status_t status = fInode->GetVolume()->FSTree()->FindExact(key, (void**)&entries, &length); if (status != B_OK) { - TRACE("DirectoryIterator::Lookup(): Couldn't find entry with hash %lu " - "\"%s\"\n", hash, name); + TRACE("DirectoryIterator::Lookup(): Couldn't find entry with hash %" B_PRIu32 + " \"%s\"\n", hash, name); return status; } diff --git a/src/add-ons/kernel/file_systems/btrfs/Inode.cpp b/src/add-ons/kernel/file_systems/btrfs/Inode.cpp index 6c231f0160..757353f2a0 100644 --- a/src/add-ons/kernel/file_systems/btrfs/Inode.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/Inode.cpp @@ -133,7 +133,6 @@ Inode::CheckPermissions(int accessMode) const } return (accessMode & ~permissions) == 0 ? B_OK : B_NOT_ALLOWED; - return B_OK; } @@ -149,12 +148,13 @@ Inode::FindBlock(off_t pos, off_t& physical, off_t *_length) status_t status = fVolume->FSTree()->FindPrevious(search_key, (void**)&extent_data); if (status != B_OK) { - ERROR("Inode::FindBlock(): Couldn't find extent_data 0x%lx\n", status); + ERROR("Inode::FindBlock(): Couldn't find extent_data 0x%" B_PRIx32 + "\n", status); return status; } - TRACE("Inode::FindBlock(%" B_PRIdINO ") key.Offset() %lld\n", ID(), - search_key.Offset()); + TRACE("Inode::FindBlock(%" B_PRIdINO ") key.Offset() %" B_PRId64 "\n", + ID(), search_key.Offset()); off_t diff = pos - search_key.Offset(); off_t logical = 0; @@ -165,8 +165,8 @@ Inode::FindBlock(off_t pos, off_t& physical, off_t *_length) status = fVolume->FindBlock(logical, physical); if (_length != NULL) *_length = extent_data->Size() - diff; - TRACE("Inode::FindBlock(%" B_PRIdINO ") %lld physical %lld\n", ID(), - pos, physical); + TRACE("Inode::FindBlock(%" B_PRIdINO ") %" B_PRIdOFF " physical %" + B_PRIdOFF "\n", ID(), pos, physical); free(extent_data); return status; @@ -180,14 +180,14 @@ Inode::ReadAt(off_t pos, uint8* buffer, size_t* _length) // set/check boundaries for pos/length if (pos < 0) { - ERROR("inode %" B_PRIdINO ": ReadAt failed(pos %lld, length %lu)\n", - ID(), pos, length); + ERROR("inode %" B_PRIdINO ": ReadAt failed(pos %" B_PRIdOFF + ", length %lu)\n", ID(), pos, length); return B_BAD_VALUE; } if (pos >= Size() || length == 0) { - TRACE("inode %" B_PRIdINO ": ReadAt 0 (pos %lld, length %lu)\n", - ID(), pos, length); + TRACE("inode %" B_PRIdINO ": ReadAt 0 (pos %" B_PRIdOFF + ", length %lu)\n", ID(), pos, length); *_length = 0; return B_NO_ERROR; } @@ -204,14 +204,15 @@ Inode::ReadAt(off_t pos, uint8* buffer, size_t* _length) status_t status = fVolume->FSTree()->FindPrevious(search_key, (void**)&extent_data, &item_size); if (status != B_OK) { - ERROR("Inode::FindBlock(): Couldn't find extent_data 0x%lx\n", status); + ERROR("Inode::FindBlock(): Couldn't find extent_data 0x%" B_PRIx32 + "\n", status); return status; } uint8 compression = extent_data->Compression(); if (FileCache() != NULL && extent_data->Type() == BTRFS_EXTENT_DATA_REGULAR) { - TRACE("inode %" B_PRIdINO ": ReadAt cache (pos %lld, length %lu)\n", + TRACE("inode %" B_PRIdINO ": ReadAt cache (pos %" B_PRIdOFF ", length %lu)\n", ID(), pos, length); free(extent_data); if (compression == BTRFS_EXTENT_COMPRESS_NONE) @@ -222,7 +223,7 @@ Inode::ReadAt(off_t pos, uint8* buffer, size_t* _length) panic("unknown extent compression; %d\n", compression); } - TRACE("Inode::ReadAt(%" B_PRIdINO ") key.Offset() %lld\n", ID(), + TRACE("Inode::ReadAt(%" B_PRIdINO ") key.Offset() %" B_PRId64 "\n", ID(), search_key.Offset()); off_t diff = pos - search_key.Offset(); @@ -256,8 +257,8 @@ Inode::ReadAt(off_t pos, uint8* buffer, size_t* _length) size_t inline_size = item_size - 13; bool headerRead = false; - TRACE("Inode::ReadAt(%" B_PRIdINO ") diff %lld size %ld\n", ID(), - diff, item_size); + TRACE("Inode::ReadAt(%" B_PRIdINO ") diff %" B_PRIdOFF " size %" + B_PRIuSIZE "\n", ID(), diff, item_size); do { ssize_t bytesRead = min_c(sizeof(in), inline_size - offset); diff --git a/src/add-ons/kernel/file_systems/btrfs/Volume.cpp b/src/add-ons/kernel/file_systems/btrfs/Volume.cpp index 0afac4c96f..5b994474d1 100644 --- a/src/add-ons/kernel/file_systems/btrfs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/Volume.cpp @@ -278,14 +278,15 @@ Volume::Mount(const char* deviceName, uint32 flags) } fBlockSize = fSuperBlock.BlockSize(); - TRACE("block size %ld\n", fBlockSize); + TRACE("block size %" B_PRIu32 "\n", fBlockSize); uint8* start = (uint8*)&fSuperBlock.system_chunk_array[0]; uint8* end = (uint8*)&fSuperBlock.system_chunk_array[2048]; while (start < end) { struct btrfs_key* key = (struct btrfs_key*)start; - TRACE("system_chunk_array object_id 0x%llx offset 0x%llx type 0x%x\n", - key->ObjectID(), key->Offset(), key->Type()); + TRACE("system_chunk_array object_id 0x%" B_PRIx64 " offset 0x%" + B_PRIx64 " type 0x%x\n", key->ObjectID(), key->Offset(), + key->Type()); if (key->Type() != BTRFS_KEY_TYPE_CHUNK_ITEM) { break; } @@ -297,16 +298,17 @@ Volume::Mount(const char* deviceName, uint32 flags) start += sizeof(struct btrfs_key) + fChunk->Size(); } - TRACE("Volume::Mount() generation: %lld\n", fSuperBlock.Generation()); + TRACE("Volume::Mount() generation: %" B_PRIu64 "\n", + fSuperBlock.Generation()); fsblock_t physical = 0; FindBlock(fSuperBlock.Root(), physical); - TRACE("Volume::Mount() root: %lld (physical %lld)\n", + TRACE("Volume::Mount() root: %" B_PRIu64 " (physical %" B_PRIu64 ")\n", fSuperBlock.Root(), physical); FindBlock(fSuperBlock.ChunkRoot(), physical); - TRACE("Volume::Mount() chunk_root: %lld (physical %lld)\n", - fSuperBlock.ChunkRoot(), physical); + TRACE("Volume::Mount() chunk_root: %" B_PRIu64 " (physical %" B_PRIu64 + ")\n", fSuperBlock.ChunkRoot(), physical); FindBlock(fSuperBlock.LogRoot(), physical); - TRACE("Volume::Mount() log_root: %lld (physical %lld)\n", + TRACE("Volume::Mount() log_root: %" B_PRIu64 " (physical %" B_PRIu64 ")\n", fSuperBlock.LogRoot(), physical); // check if the device size is large enough to hold the file system @@ -329,13 +331,13 @@ Volume::Mount(const char* deviceName, uint32 flags) return B_NO_MEMORY; FindBlock(fSuperBlock.Root(), physical); - TRACE("Volume::Mount() root: %lld (physical %lld)\n", + TRACE("Volume::Mount() root: %" B_PRIu64 " (physical %" B_PRIu64 ")\n", fSuperBlock.Root(), physical); FindBlock(fSuperBlock.ChunkRoot(), physical); - TRACE("Volume::Mount() chunk_root: %lld (physical %lld)\n", - fSuperBlock.ChunkRoot(), physical); + TRACE("Volume::Mount() chunk_root: %" B_PRIu64 " (physical %" B_PRIu64 + ")\n", fSuperBlock.ChunkRoot(), physical); FindBlock(fSuperBlock.LogRoot(), physical); - TRACE("Volume::Mount() log_root: %lld (physical %lld)\n", + TRACE("Volume::Mount() log_root: %" B_PRIu64 " (physical %" B_PRIu64 ")\n", fSuperBlock.LogRoot(), physical); fRootTree = new(std::nothrow) BPlusTree(this, fSuperBlock.Root()); @@ -351,7 +353,8 @@ Volume::Mount(const char* deviceName, uint32 flags) ERROR("Volume::Mount(): Couldn't find extent root\n"); return B_ERROR; } - TRACE("Volume::Mount(): Found extent root: %lld\n", root->BlockNum()); + TRACE("Volume::Mount(): Found extent root: %" B_PRIu64 "\n", + root->BlockNum()); fExtentTree = new(std::nothrow) BPlusTree(this, root->BlockNum()); free(root); if (fExtentTree == NULL) @@ -363,7 +366,7 @@ Volume::Mount(const char* deviceName, uint32 flags) ERROR("Volume::Mount(): Couldn't find fs root\n"); return B_ERROR; } - TRACE("Volume::Mount(): Found fs root: %lld\n", root->BlockNum()); + TRACE("Volume::Mount(): Found fs root: %" B_PRIu64 "\n", root->BlockNum()); fFSTree = new(std::nothrow) BPlusTree(this, root->BlockNum()); free(root); if (fFSTree == NULL) @@ -375,7 +378,8 @@ Volume::Mount(const char* deviceName, uint32 flags) ERROR("Volume::Mount(): Couldn't find dev root\n"); return B_ERROR; } - TRACE("Volume::Mount(): Found dev root: %lld\n", root->BlockNum()); + TRACE("Volume::Mount(): Found dev root: %" B_PRIu64 "\n", + root->BlockNum()); fDevTree = new(std::nothrow) BPlusTree(this, root->BlockNum()); free(root); if (fDevTree == NULL) @@ -387,7 +391,8 @@ Volume::Mount(const char* deviceName, uint32 flags) ERROR("Volume::Mount(): Couldn't find checksum root\n"); return B_ERROR; } - TRACE("Volume::Mount(): Found checksum root: %lld\n", root->BlockNum()); + TRACE("Volume::Mount(): Found checksum root: %" B_PRIu64 "\n", + root->BlockNum()); fChecksumTree = new(std::nothrow) BPlusTree(this, root->BlockNum()); free(root); if (fChecksumTree == NULL) @@ -401,8 +406,8 @@ Volume::Mount(const char* deviceName, uint32 flags) return status; } - TRACE("Volume::Mount(): Found root node: %lld (%s)\n", fRootNode->ID(), - strerror(fRootNode->InitCheck())); + TRACE("Volume::Mount(): Found root node: %" B_PRIu64 " (%s)\n", + fRootNode->ID(), strerror(fRootNode->InitCheck())); // all went fine opener.Keep(); @@ -488,7 +493,8 @@ status_t Volume::FindBlock(off_t logical, off_t &physical) { if (fChunkTree == NULL - || (logical >= fChunk->Offset() && logical < fChunk->End())) { + || (logical >= (off_t)fChunk->Offset() + && logical < (off_t)fChunk->End())) { // try with fChunk return fChunk->FindBlock(logical, physical); } @@ -509,8 +515,8 @@ Volume::FindBlock(off_t logical, off_t &physical) status = _chunk.FindBlock(logical, physical); if (status != B_OK) return status; - TRACE("Volume::FindBlock(): logical: %lld, physical: %lld\n", logical, - physical); + TRACE("Volume::FindBlock(): logical: %" B_PRIdOFF ", physical: %" B_PRIdOFF + "\n", logical, physical); return B_OK; } diff --git a/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp index eaac2c97c6..1de0f486d8 100644 --- a/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp @@ -235,7 +235,7 @@ btrfs_read_pages(fs_volume* _volume, fs_vnode* _node, void* _cookie, while (true) { file_io_vec fileVecs[8]; - uint32 fileVecCount = 8; + size_t fileVecCount = 8; status = file_map_translate(inode->Map(), pos, bytesLeft, fileVecs, &fileVecCount, 0); @@ -321,10 +321,10 @@ btrfs_get_file_map(fs_volume* _volume, fs_vnode* _node, off_t offset, offset += blockLength; size -= blockLength; - if (size <= vecs[index - 1].length || offset >= inode->Size()) { + if ((off_t)size <= vecs[index - 1].length || offset >= inode->Size()) { // We're done! *_count = index; - TRACE("btrfs_get_file_map for inode %lld\n", inode->ID()); + TRACE("btrfs_get_file_map for inode %" B_PRIdINO "\n", inode->ID()); return B_OK; } } @@ -362,7 +362,7 @@ static status_t btrfs_ioctl(fs_volume* _volume, fs_vnode* _node, void* _cookie, uint32 cmd, void* buffer, size_t bufferLength) { - TRACE("ioctl: %lu\n", cmd); + TRACE("ioctl: %" B_PRIu32 "\n", cmd); /*Volume* volume = (Volume*)_volume->private_volume;*/ return B_DEV_INVALID_IOCTL; From 575eeda9a5ac082851be3e158f26b89a1cedccbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 6 May 2013 19:05:30 +0200 Subject: [PATCH 037/136] cdda: fixes 64 bit warnings --- src/add-ons/kernel/file_systems/cdda/cdda.cpp | 6 ++--- .../file_systems/cdda/kernel_interface.cpp | 24 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/add-ons/kernel/file_systems/cdda/cdda.cpp b/src/add-ons/kernel/file_systems/cdda/cdda.cpp index 77320a9c8f..605b5ca099 100644 --- a/src/add-ons/kernel/file_systems/cdda/cdda.cpp +++ b/src/add-ons/kernel/file_systems/cdda/cdda.cpp @@ -557,7 +557,7 @@ read_cdtext(int fd, struct cdtext &cdtext) scsi_toc_general *header = (scsi_toc_general *)buffer; - size_t packLength = B_BENDIAN_TO_HOST_INT16(header->data_length) - 2; + uint32 packLength = B_BENDIAN_TO_HOST_INT16(header->data_length) - 2; cdtext_pack_data *pack = (cdtext_pack_data *)(header + 1); cdtext_pack_data *lastPack = NULL; uint8 state = 0; @@ -656,8 +656,8 @@ status_t read_cdda_data(int fd, off_t endFrame, off_t offset, void *data, size_t length, off_t bufferOffset, void *buffer, size_t bufferSize) { - if (bufferOffset >= 0 && bufferOffset <= offset + length - && bufferOffset + bufferSize > offset) { + if (bufferOffset >= 0 && bufferOffset <= offset + (off_t)length + && bufferOffset + (off_t)bufferSize > offset) { if (offset >= bufferOffset) { // buffer reaches into the beginning of the request off_t dataOffset = offset - bufferOffset; diff --git a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp index 1a78ad4b66..9ad819584a 100644 --- a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp @@ -153,7 +153,7 @@ public: status_t SetSize(off_t size); const char* Name() const { return fName; } - size_t Size() const { return fSize; } + off_t Size() const { return fSize; } type_code Type() const { return fType; } uint8* Data() const { return fData; } @@ -164,7 +164,7 @@ private: char* fName; type_code fType; uint8* fData; - size_t fSize; + off_t fSize; }; class Inode { @@ -473,7 +473,7 @@ open_attributes(uint32 cddbID, int deviceFD, int mode, if (attrMode == kDiscIDAttributes) { char id[64]; - snprintf(id, sizeof(id), "/%08lx", cddbID); + snprintf(id, sizeof(id), "/%08" B_PRIx32, cddbID); strlcat(path, id, B_PATH_NAME_LENGTH); } else if (attrMode == kDeviceAttributes) { uint32 length = strlen(path); @@ -690,14 +690,14 @@ Volume::Mount(const char* device) if (text.titles[i] != NULL) { if (text.artists[i] != NULL) { - snprintf(title, sizeof(title), "%02ld. %s - %s.wav", track, - text.artists[i], text.titles[i]); + snprintf(title, sizeof(title), "%02" B_PRId32 ". %s - %s.wav", + track, text.artists[i], text.titles[i]); } else { - snprintf(title, sizeof(title), "%02ld. %s.wav", track, - text.titles[i]); + snprintf(title, sizeof(title), "%02" B_PRId32 ". %s.wav", + track, text.titles[i]); } } else - snprintf(title, sizeof(title), "Track %02ld.wav", track); + snprintf(title, sizeof(title), "Track %02" B_PRId32 ".wav", track); // remove '/' and '\n' from title for (int32 j = 0; title[j]; j++) { @@ -722,7 +722,7 @@ Volume::Mount(const char* device) inode->AddAttribute("Audio:Track", B_INT32_TYPE, (uint32)track); inode->AddAttribute("Audio:Bitrate", B_STRING_TYPE, "1411 kbps"); inode->AddAttribute("Media:Length", B_INT64_TYPE, - inode->FrameCount() * 1000000LL / kFramesPerSecond); + inode->FrameCount() * 1000000L / kFramesPerSecond); inode->AddAttribute("BEOS:TYPE", B_MIME_STRING_TYPE, "audio/x-wav"); } @@ -1044,7 +1044,7 @@ Attribute::ReadAt(off_t offset, uint8* buffer, size_t* _length) *_length = 0; return B_OK; } - if (offset + length > fSize) + if (offset + (off_t)length > fSize) length = fSize - offset; if (user_memcpy(buffer, fData + offset, length) < B_OK) @@ -1710,13 +1710,13 @@ cdda_read(fs_volume* _volume, fs_vnode* _node, void* _cookie, off_t offset, } size_t length = *_length; - if (offset + length > maxSize) + if (offset + (off_t)length > maxSize) length = maxSize - offset; status_t status = B_OK; size_t bytesRead = 0; - if (offset < sizeof(wav_header)) { + if (offset < (off_t)sizeof(wav_header)) { // read fake WAV header size_t size = sizeof(wav_header) - offset; size = min_c(size, length); From 3f5d1e78252bb593cf5b430f37c3d18d779afab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 6 May 2013 19:44:24 +0200 Subject: [PATCH 038/136] exfat: fixes 64 bit warnings --- .../kernel/file_systems/exfat/DataStream.cpp | 4 +- .../file_systems/exfat/DirectoryIterator.cpp | 18 +++++---- .../kernel/file_systems/exfat/Inode.cpp | 15 +++---- src/add-ons/kernel/file_systems/exfat/Inode.h | 2 +- .../kernel/file_systems/exfat/Volume.cpp | 18 +++++---- .../kernel/file_systems/exfat/encodings.cpp | 40 +++++++++---------- .../kernel/file_systems/exfat/encodings.h | 6 +-- .../file_systems/exfat/kernel_interface.cpp | 8 ++-- 8 files changed, 58 insertions(+), 53 deletions(-) diff --git a/src/add-ons/kernel/file_systems/exfat/DataStream.cpp b/src/add-ons/kernel/file_systems/exfat/DataStream.cpp index 48edf05709..5a9647e7c8 100644 --- a/src/add-ons/kernel/file_systems/exfat/DataStream.cpp +++ b/src/add-ons/kernel/file_systems/exfat/DataStream.cpp @@ -62,8 +62,8 @@ DataStream::FindBlock(off_t pos, off_t& physical, off_t *_length) } *_length = min_c((cluster - clusterIndex + 1) * kClusterSize - offset, fSize - pos); - TRACE("inode %" B_PRIdINO ": cluster %ld, pos %lld, %lld\n", - fInode->ID(), clusterIndex, pos, physical); + TRACE("inode %" B_PRIdINO ": cluster %" B_PRIu32 ", pos %" B_PRIdOFF ", %" + B_PRIdOFF "\n", fInode->ID(), clusterIndex, pos, physical); return B_OK; } diff --git a/src/add-ons/kernel/file_systems/exfat/DirectoryIterator.cpp b/src/add-ons/kernel/file_systems/exfat/DirectoryIterator.cpp index bfa0553136..2c33bbab3d 100644 --- a/src/add-ons/kernel/file_systems/exfat/DirectoryIterator.cpp +++ b/src/add-ons/kernel/file_systems/exfat/DirectoryIterator.cpp @@ -27,7 +27,7 @@ DirectoryIterator::DirectoryIterator(Inode* inode) fBlock(inode->GetVolume()), fCurrent(NULL) { - TRACE("DirectoryIterator::DirectoryIterator() %ld\n", fCluster); + TRACE("DirectoryIterator::DirectoryIterator() %" B_PRIu32 "\n", fCluster); } @@ -78,7 +78,7 @@ DirectoryIterator::GetNext(char* name, size_t* _nameLength, ino_t* _id, if (status == B_OK && name != NULL) { status = unicode_to_utf8(unicodeName, nameLength, (uint8 *)name, _nameLength); - TRACE("DirectoryIterator::GetNext() %ld %s, %" B_PRIdINO "\n", + TRACE("DirectoryIterator::GetNext() %" B_PRIu32 " %s, %" B_PRIdINO "\n", fInode->Cluster(), name, *_id); } @@ -184,8 +184,9 @@ DirectoryIterator::_GetNext(uchar* name, size_t* _nameLength, ino_t* _id, status_t status; int32 chunkCount = 1; while ((status = _NextEntry()) == B_OK) { - TRACE("DirectoryIterator::_GetNext() %ld/%p, type 0x%x, offset %lld\n", - fInode->Cluster(), fCurrent, fCurrent->type, fOffset); + TRACE("DirectoryIterator::_GetNext() %" B_PRIu32 "/%p, type 0x%x, " + "offset %" B_PRId64 "\n", fInode->Cluster(), fCurrent, + fCurrent->type, fOffset); if (fCurrent->type == EXFAT_ENTRY_TYPE_FILE) { chunkCount = fCurrent->file.chunkCount; if (_id != NULL) { @@ -194,8 +195,8 @@ DirectoryIterator::_GetNext(uchar* name, size_t* _nameLength, ino_t* _id, } if (visitor != NULL) visitor->VisitFile(fCurrent); - TRACE("DirectoryIterator::_GetNext() File chunkCount %ld\n", - chunkCount); + TRACE("DirectoryIterator::_GetNext() File chunkCount %" B_PRId32 + "\n", chunkCount); } else if (fCurrent->type == EXFAT_ENTRY_TYPE_FILEINFO) { chunkCount--; TRACE("DirectoryIterator::_GetNext() Filename length %d\n", @@ -241,7 +242,8 @@ DirectoryIterator::_NextEntry() fInode->GetVolume()->ClusterToBlock(fCluster, block); block += (fOffset / fInode->GetVolume()->EntriesPerBlock()) % (1 << fInode->GetVolume()->SuperBlock().BlocksPerClusterShift()); - TRACE("DirectoryIterator::_NextEntry() init to block %lld\n", block); + TRACE("DirectoryIterator::_NextEntry() init to block %" B_PRIu64 "\n", + block); fCurrent = (struct exfat_entry*)fBlock.SetTo(block) + fOffset % fInode->GetVolume()->EntriesPerBlock(); } else if ((fOffset % fInode->GetVolume()->EntriesPerBlock()) == 0) { @@ -253,7 +255,7 @@ DirectoryIterator::_NextEntry() fInode->GetVolume()->ClusterToBlock(fCluster, block); } else block = fBlock.BlockNumber() + 1; - TRACE("DirectoryIterator::_NextEntry() block %lld\n", block); + TRACE("DirectoryIterator::_NextEntry() block %" B_PRIu64 "\n", block); fCurrent = (struct exfat_entry*)fBlock.SetTo(block); } else fCurrent++; diff --git a/src/add-ons/kernel/file_systems/exfat/Inode.cpp b/src/add-ons/kernel/file_systems/exfat/Inode.cpp index a03c13cceb..7081565640 100644 --- a/src/add-ons/kernel/file_systems/exfat/Inode.cpp +++ b/src/add-ons/kernel/file_systems/exfat/Inode.cpp @@ -37,8 +37,8 @@ Inode::Inode(Volume* volume, cluster_t cluster, uint32 offset) fCache(NULL), fMap(NULL) { - TRACE("Inode::Inode(%ld, %d) inode %" B_PRIdINO "\n", Cluster(), Offset(), - ID()); + TRACE("Inode::Inode(%" B_PRIu32 ", %" B_PRIu32 ") inode %" B_PRIdINO "\n", + Cluster(), Offset(), ID()); _Init(); if (ID() == 1) { @@ -72,7 +72,8 @@ Inode::Inode(Volume* volume, ino_t ino) fOffset = key->offset; fInitStatus = B_OK; } - TRACE("Inode::Inode(%" B_PRIdINO ") cluster %ld\n", ID(), Cluster()); + TRACE("Inode::Inode(%" B_PRIdINO ") cluster %" B_PRIu32 "\n", ID(), + Cluster()); _Init(); if (fInitStatus == B_OK && ID() != 1) { @@ -204,14 +205,14 @@ Inode::ReadAt(off_t pos, uint8* buffer, size_t* _length) // set/check boundaries for pos/length if (pos < 0) { - ERROR("inode %" B_PRIdINO ": ReadAt failed(pos %lld, length %lu)\n", - ID(), pos, length); + ERROR("inode %" B_PRIdINO ": ReadAt failed(pos %" B_PRIdOFF", length %" + B_PRIuSIZE ")\n", ID(), pos, length); return B_BAD_VALUE; } if (pos >= Size() || length == 0) { - TRACE("inode %" B_PRIdINO ": ReadAt 0 (pos %lld, length %lu)\n", - ID(), pos, length); + TRACE("inode %" B_PRIdINO ": ReadAt 0 (pos %" B_PRIdOFF", length %" + B_PRIuSIZE ")\n", ID(), pos, length); *_length = 0; return B_NO_ERROR; } diff --git a/src/add-ons/kernel/file_systems/exfat/Inode.h b/src/add-ons/kernel/file_systems/exfat/Inode.h index 9c0ee1628e..26bc92fa0d 100644 --- a/src/add-ons/kernel/file_systems/exfat/Inode.h +++ b/src/add-ons/kernel/file_systems/exfat/Inode.h @@ -40,7 +40,7 @@ public: ino_t ID() const { return fID; } ino_t Parent() const { return fParent; } cluster_t Cluster() const { return fCluster; } - uint32_t Offset() const { return fOffset; } + uint32 Offset() const { return fOffset; } cluster_t StartCluster() const { return fFileInfoEntry.file_info.StartCluster(); } bool IsContiguous() const diff --git a/src/add-ons/kernel/file_systems/exfat/Volume.cpp b/src/add-ons/kernel/file_systems/exfat/Volume.cpp index 8fea222077..feea51b48d 100644 --- a/src/add-ons/kernel/file_systems/exfat/Volume.cpp +++ b/src/add-ons/kernel/file_systems/exfat/Volume.cpp @@ -318,7 +318,7 @@ Volume::Mount(const char* deviceName, uint32 flags) } fBlockSize = 1 << fSuperBlock.BlockShift(); - TRACE("block size %ld\n", fBlockSize); + TRACE("block size %" B_PRIu32 "\n", fBlockSize); fEntriesPerBlock = (fBlockSize / sizeof(struct exfat_entry)); // check if the device size is large enough to hold the file system @@ -348,7 +348,7 @@ Volume::Mount(const char* deviceName, uint32 flags) return status; } - TRACE("Volume::Mount(): Found root node: %lld (%s)\n", fRootNode->ID(), + TRACE("Volume::Mount(): Found root node: %" B_PRIdINO " (%s)\n", fRootNode->ID(), strerror(fRootNode->InitCheck())); // all went fine @@ -422,7 +422,8 @@ Volume::ClusterToBlock(cluster_t cluster, fsblock_t &block) return B_BAD_VALUE; block = ((cluster - 2) << SuperBlock().BlocksPerClusterShift()) + SuperBlock().FirstDataBlock(); - TRACE("Volume::ClusterToBlock() cluster %lu %u %lu: %llu, %lu\n", cluster, + TRACE("Volume::ClusterToBlock() cluster %" B_PRIu32 " %u %" B_PRIu32 ": %" + B_PRIu64 ", %" B_PRIu32 "\n", cluster, SuperBlock().BlocksPerClusterShift(), SuperBlock().FirstDataBlock(), block, SuperBlock().FirstFatBlock()); return B_OK; @@ -438,7 +439,8 @@ Volume::NextCluster(cluster_t _cluster) + _cluster / clusterPerBlock; cluster_t *cluster = (cluster_t *)block.SetTo(blockNum); cluster += _cluster % clusterPerBlock; - TRACE("Volume::NextCluster() cluster %lu next %lu\n", _cluster, *cluster); + TRACE("Volume::NextCluster() cluster %" B_PRIu32 " next %" B_PRIu32 "\n", + _cluster, *cluster); return *cluster; } @@ -465,8 +467,8 @@ Volume::GetIno(cluster_t cluster, uint32 offset, ino_t parent) key.offset = offset; struct node* node = fNodeTree.Lookup(key); if (node != NULL) { - TRACE("Volume::GetIno() cached cluster %lu offset %lu ino %" B_PRIdINO - "\n", cluster, offset, node->ino); + TRACE("Volume::GetIno() cached cluster %" B_PRIu32 " offset %" B_PRIu32 + " ino %" B_PRIdINO "\n", cluster, offset, node->ino); return node->ino; } node = new struct node(); @@ -475,8 +477,8 @@ Volume::GetIno(cluster_t cluster, uint32 offset, ino_t parent) node->parent = parent; fNodeTree.Insert(node); fInoTree.Insert(node); - TRACE("Volume::GetIno() new cluster %lu offset %lu ino %" B_PRIdINO "\n", - cluster, offset, node->ino); + TRACE("Volume::GetIno() new cluster %" B_PRIu32 " offset %" B_PRIu32 + " ino %" B_PRIdINO "\n", cluster, offset, node->ino); return node->ino; } diff --git a/src/add-ons/kernel/file_systems/exfat/encodings.cpp b/src/add-ons/kernel/file_systems/exfat/encodings.cpp index 09c69c56d8..0393fab255 100644 --- a/src/add-ons/kernel/file_systems/exfat/encodings.cpp +++ b/src/add-ons/kernel/file_systems/exfat/encodings.cpp @@ -98,14 +98,14 @@ static status_t _lendian_unicode_to_utf8( const char *src, - int32 *srcLen, + size_t *srcLen, char *dst, - uint32 *dstLen) + size_t *dstLen) { - int32 srcLimit = *srcLen; - int32 dstLimit = *dstLen; - int32 srcCount = 0; - int32 dstCount = 0; + size_t srcLimit = *srcLen; + size_t dstLimit = *dstLen; + size_t srcCount = 0; + size_t dstCount = 0; status_t status = B_ERROR; for (srcCount = 0; srcCount < srcLimit; srcCount += 2) { @@ -142,14 +142,14 @@ _lendian_unicode_to_utf8( static status_t _utf8_to_lendian_unicode( const char *src, - int32 *srcLen, + size_t *srcLen, char *dst, - uint32 *dstLen) + size_t *dstLen) { - int32 srcLimit = *srcLen; - int32 dstLimit = *dstLen - 1; - int32 srcCount = 0; - int32 dstCount = 0; + size_t srcLimit = *srcLen; + size_t dstLimit = *dstLen - 1; + size_t srcCount = 0; + size_t dstCount = 0; status_t status = B_ERROR; while ((srcCount < srcLimit) && (dstCount < dstLimit)) { @@ -186,12 +186,12 @@ _utf8_to_lendian_unicode( // takes a unicode name of unilen uchar's and converts to a utf8 name of at // most utf8len uint8's -status_t unicode_to_utf8(const uchar *uni, uint32 unilen, uint8 *utf8, - uint32 *utf8len) +status_t unicode_to_utf8(const uchar *uni, size_t unilen, uint8 *utf8, + size_t *utf8len) { - uint32 origlen = unilen; + //size_t origlen = unilen; status_t result = _lendian_unicode_to_utf8((char *)uni, - (int32 *)&unilen, (char *)utf8, utf8len); + &unilen, (char *)utf8, utf8len); /*if (unilen < origlen) { panic("Name is too long (%lx < %lx)\n", unilen, origlen); @@ -202,13 +202,13 @@ status_t unicode_to_utf8(const uchar *uni, uint32 unilen, uint8 *utf8, } -status_t utf8_to_unicode(const char *utf8, uchar *uni, uint32 *unilen) +status_t utf8_to_unicode(const char *utf8, uchar *uni, size_t *unilen) { - uint32 origlen = strlen(utf8) + 1; - uint32 utf8len = origlen; + size_t origlen = strlen(utf8) + 1; + size_t utf8len = origlen; status_t result = _utf8_to_lendian_unicode(utf8, - (int32 *)&utf8len, (char *)uni, unilen); + &utf8len, (char *)uni, unilen); /*if (origlen < utf8len) { panic("Name is too long (%lx < %lx)\n", *unilen, origlen); diff --git a/src/add-ons/kernel/file_systems/exfat/encodings.h b/src/add-ons/kernel/file_systems/exfat/encodings.h index 2d4fdcd33a..eaddd918bd 100644 --- a/src/add-ons/kernel/file_systems/exfat/encodings.h +++ b/src/add-ons/kernel/file_systems/exfat/encodings.h @@ -9,9 +9,9 @@ extern "C" { #endif -status_t unicode_to_utf8(const uchar *uni, uint32 unilen, uint8 *utf8, - uint32 *utf8len); -status_t utf8_to_unicode(const char *utf8, uchar *uni, uint32 *unilen); +status_t unicode_to_utf8(const uchar *uni, size_t unilen, uint8 *utf8, + size_t *utf8len); +status_t utf8_to_unicode(const char *utf8, uchar *uni, size_t *unilen); #ifdef __cplusplus } diff --git a/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp b/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp index 2fd7d2fbbf..c2110e713a 100644 --- a/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp @@ -236,7 +236,7 @@ exfat_read_pages(fs_volume* _volume, fs_vnode* _node, void* _cookie, while (true) { file_io_vec fileVecs[8]; - uint32 fileVecCount = 8; + size_t fileVecCount = 8; status = file_map_translate(inode->Map(), pos, bytesLeft, fileVecs, &fileVecCount, 0); @@ -322,10 +322,10 @@ exfat_get_file_map(fs_volume* _volume, fs_vnode* _node, off_t offset, offset += blockLength; size -= blockLength; - if (size <= vecs[index - 1].length || offset >= inode->Size()) { + if ((off_t)size <= vecs[index - 1].length || offset >= inode->Size()) { // We're done! *_count = index; - TRACE("exfat_get_file_map for inode %lld\n", inode->ID()); + TRACE("exfat_get_file_map for inode %" B_PRIdINO"\n", inode->ID()); return B_OK; } } @@ -367,7 +367,7 @@ static status_t exfat_ioctl(fs_volume* _volume, fs_vnode* _node, void* _cookie, uint32 cmd, void* buffer, size_t bufferLength) { - TRACE("ioctl: %lu\n", cmd); + TRACE("ioctl: %" B_PRIu32 "\n", cmd); /*Volume* volume = (Volume*)_volume->private_volume;*/ return B_DEV_INVALID_IOCTL; From d97b43406038a6398e097939b71908ff490c64ff Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 16:50:23 -0400 Subject: [PATCH 039/136] Style fixes to BMenu and related classes. --- headers/os/interface/Menu.h | 3 +- headers/os/interface/MenuField.h | 4 +- src/kits/interface/BMCPrivate.cpp | 2 +- src/kits/interface/Menu.cpp | 12 ++-- src/kits/interface/MenuField.cpp | 24 ++++---- src/kits/interface/MenuItem.cpp | 91 +++++++++++++++--------------- src/kits/interface/MenuPrivate.cpp | 16 +++--- 7 files changed, 75 insertions(+), 77 deletions(-) diff --git a/headers/os/interface/Menu.h b/headers/os/interface/Menu.h index 4ef27a77f5..41a17fe78b 100644 --- a/headers/os/interface/Menu.h +++ b/headers/os/interface/Menu.h @@ -10,6 +10,7 @@ #include #include + class BMenu; class BMenuBar; class BMenuItem; @@ -216,7 +217,7 @@ private: void _ComputeColumnLayout(int32 index, bool bestFit, bool moveItems, BRect* override, BRect& outRect); void _ComputeRowLayout(int32 index, bool bestFit, - bool moveItems, BRect& outRect); + bool moveItems, BRect& outRect); void _ComputeMatrixLayout(BRect& outRect); BRect _CalcFrame(BPoint where, bool* scrollOn); diff --git a/headers/os/interface/MenuField.h b/headers/os/interface/MenuField.h index 2fba75910c..d58cd7a148 100644 --- a/headers/os/interface/MenuField.h +++ b/headers/os/interface/MenuField.h @@ -35,7 +35,7 @@ public: virtual status_t Archive(BMessage* archive, bool deep = true) const; - virtual void Draw(BRect update); + virtual void Draw(BRect updateRect); virtual void AttachedToWindow(); virtual void AllAttached(); virtual void MouseDown(BPoint where); @@ -121,7 +121,7 @@ private: void InitObject(const char* label); void InitObject2(); - void DrawLabel(BRect bounds, BRect update); + void DrawLabel(BRect bounds, BRect updateRect); static void InitMenu(BMenu* menu); int32 _MenuTask(); diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index 56c4efaf57..25bfe2043a 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -271,7 +271,6 @@ _BMCMenuBar_::FrameResized(float width, float height) dirty = Bounds(); dirty.left = dirty.right - diff - 12; Invalidate(dirty); - } else if (diff < 0) { // clean up the dirty right line of // the menu field when shrinking @@ -295,6 +294,7 @@ _BMCMenuBar_::FrameResized(float width, float height) diff = Frame().right + 2 - fMenuField->Bounds().right; fMenuField->ResizeBy(diff, 0.0); } + BMenuBar::FrameResized(width, height); } diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index e7049cf962..76e1eb37e2 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -733,7 +733,7 @@ BMenu::AddItem(BMenuItem* item, BRect frame) "be called if the menu layout is B_ITEMS_IN_MATRIX"); } - if (!item) + if (item == NULL) return false; item->fBounds = frame; @@ -758,7 +758,7 @@ bool BMenu::AddItem(BMenu* submenu) { BMenuItem* item = new (nothrow) BMenuItem(submenu); - if (!item) + if (item == NULL) return false; if (!AddItem(item, CountItems())) { @@ -780,7 +780,7 @@ BMenu::AddItem(BMenu* submenu, int32 index) } BMenuItem* item = new (nothrow) BMenuItem(submenu); - if (!item) + if (item == NULL) return false; if (!AddItem(item, index)) { @@ -802,7 +802,7 @@ BMenu::AddItem(BMenu* submenu, BRect frame) } BMenuItem* item = new (nothrow) BMenuItem(submenu); - if (!item) + if (item == NULL) return false; if (!AddItem(item, frame)) { @@ -2848,7 +2848,8 @@ BMenu::_UpdateWindowViewSize(const bool &move) return; bool scroll = false; - const BPoint screenLocation = move ? ScreenLocation() : window->Frame().LeftTop(); + const BPoint screenLocation = move ? ScreenLocation() + : window->Frame().LeftTop(); BRect frame = _CalcFrame(screenLocation, &scroll); ResizeTo(frame.Width(), frame.Height()); @@ -3024,4 +3025,3 @@ B_IF_GCC_2(InvalidateLayout__5BMenub,_ZN5BMenu16InvalidateLayoutEb)( { menu->InvalidateLayout(); } - diff --git a/src/kits/interface/MenuField.cpp b/src/kits/interface/MenuField.cpp index 31aacbdb4f..bda34a2f93 100644 --- a/src/kits/interface/MenuField.cpp +++ b/src/kits/interface/MenuField.cpp @@ -353,12 +353,12 @@ BMenuField::AllUnarchived(const BMessage* from) void -BMenuField::Draw(BRect update) +BMenuField::Draw(BRect updateRect) { BRect bounds(Bounds()); bool active = IsFocus() && Window()->IsActive(); - DrawLabel(bounds, update); + DrawLabel(bounds, updateRect); BRect frame(fMenuBar->Frame()); @@ -370,7 +370,7 @@ BMenuField::Draw(BRect update) flags |= BControlLook::B_DISABLED; if (active) flags |= BControlLook::B_FOCUSED; - be_control_look->DrawMenuFieldFrame(this, frame, update, base, + be_control_look->DrawMenuFieldFrame(this, frame, updateRect, base, background, flags); } @@ -423,7 +423,7 @@ BMenuField::MouseDown(BPoint where) fMenuBar->StartMenuBar(-1, false, true, &bounds); fMenuTaskID = spawn_thread((thread_func)_thread_entry, - "_m_task_", B_NORMAL_PRIORITY, this); + "_m_task_", B_NORMAL_PRIORITY, this); if (fMenuTaskID >= 0) resume_thread(fMenuTaskID); } @@ -473,9 +473,9 @@ BMenuField::MakeFocus(bool state) void -BMenuField::MessageReceived(BMessage* msg) +BMenuField::MessageReceived(BMessage* message) { - BView::MessageReceived(msg); + BView::MessageReceived(message); } @@ -980,7 +980,7 @@ BMenuField::InitObject2() void -BMenuField::DrawLabel(BRect bounds, BRect update) +BMenuField::DrawLabel(BRect bounds, BRect updateRect) { CALLED(); @@ -1107,8 +1107,8 @@ BMenuField::_InitMenuBar(BMenu* menu, BRect frame, bool fixedSize) fMenu = menu; InitMenu(menu); - if ((Flags() & B_SUPPORTS_LAYOUT)) { - fMenuBar = new _BMCMenuBar_(fixedSize, this); + if ((Flags() & B_SUPPORTS_LAYOUT) != 0) { + fMenuBar = new _BMCMenuBar_(this); } else { frame.left = _MenuBarOffset(); frame.top = kVMargin; @@ -1147,7 +1147,7 @@ BMenuField::_InitMenuBar(const BMessage* archive) fFixedSizeMB = fixed; fMenuBar = (BMenuBar*)FindView("_mc_mb_"); - if (!fMenuBar) { + if (fMenuBar == NULL) { _InitMenuBar(new BMenu(""), BRect(0, 0, 100, 15), fFixedSizeMB); InitObject2(); } else { @@ -1194,8 +1194,8 @@ BMenuField::_ValidateLayoutData() divider = fLayoutData->label_width + 5; // If we shan't do real layout, we let the current divider take influence. - if (!(Flags() & B_SUPPORTS_LAYOUT)) - divider = max_c(divider, fDivider); + if ((Flags() & B_SUPPORTS_LAYOUT) == 0) + divider = std::max(divider, fDivider); // get the minimal (== preferred) menu bar size // TODO: BMenu::MinSize() is using the ResizeMode() to decide the diff --git a/src/kits/interface/MenuItem.cpp b/src/kits/interface/MenuItem.cpp index 0b5f211027..94d2d66138 100644 --- a/src/kits/interface/MenuItem.cpp +++ b/src/kits/interface/MenuItem.cpp @@ -55,8 +55,8 @@ const char *kUTF8ControlMap[] = { using BPrivate::MenuPrivate; -BMenuItem::BMenuItem(const char *label, BMessage *message, char shortcut, - uint32 modifiers) +BMenuItem::BMenuItem(const char* label, BMessage* message, char shortcut, + uint32 modifiers) { _InitData(); if (label != NULL) @@ -73,7 +73,7 @@ BMenuItem::BMenuItem(const char *label, BMessage *message, char shortcut, } -BMenuItem::BMenuItem(BMenu *menu, BMessage *message) +BMenuItem::BMenuItem(BMenu* menu, BMessage* message) { _InitData(); SetMessage(message); @@ -81,7 +81,7 @@ BMenuItem::BMenuItem(BMenu *menu, BMessage *message) } -BMenuItem::BMenuItem(BMessage *data) +BMenuItem::BMenuItem(BMessage* data) { _InitData(); @@ -121,9 +121,9 @@ BMenuItem::BMenuItem(BMessage *data) BMessage subMessage; if (data->FindMessage("_submenu", &subMessage) == B_OK) { - BArchivable *object = instantiate_object(&subMessage); + BArchivable* object = instantiate_object(&subMessage); if (object != NULL) { - BMenu *menu = dynamic_cast(object); + BMenu* menu = dynamic_cast(object); if (menu != NULL) _InitMenuData(menu); } @@ -131,8 +131,8 @@ BMenuItem::BMenuItem(BMessage *data) } -BArchivable * -BMenuItem::Instantiate(BMessage *data) +BArchivable* +BMenuItem::Instantiate(BMessage* data) { if (validate_instantiation(data, "BMenuItem")) return new BMenuItem(data); @@ -142,7 +142,7 @@ BMenuItem::Instantiate(BMessage *data) status_t -BMenuItem::Archive(BMessage *data, bool deep) const +BMenuItem::Archive(BMessage* data, bool deep) const { status_t ret = BArchivable::Archive(data, deep); @@ -217,7 +217,7 @@ BMenuItem::SetEnabled(bool state) if (fSubmenu != NULL) fSubmenu->SetEnabled(state); - BMenu *menu = Menu(); + BMenu* menu = fSuper; if (menu != NULL && menu->LockLooper()) { menu->Invalidate(fBounds); menu->UnlockLooper(); @@ -230,8 +230,8 @@ BMenuItem::SetMarked(bool state) { fMark = state; - if (state && Menu() != NULL) { - MenuPrivate priv(Menu()); + if (state && fSuper != NULL) { + MenuPrivate priv(fSuper); priv.ItemMarked(this); } } @@ -292,7 +292,7 @@ BMenuItem::SetShortcut(char ch, uint32 modifiers) } -const char * +const char* BMenuItem::Label() const { return fLabel; @@ -308,7 +308,7 @@ BMenuItem::IsEnabled() const if (!fEnabled) return false; - return fSuper ? fSuper->IsEnabled() : true; + return fSuper != NULL ? fSuper->IsEnabled() : true; } @@ -327,7 +327,7 @@ BMenuItem::Trigger() const char -BMenuItem::Shortcut(uint32 *modifiers) const +BMenuItem::Shortcut(uint32* modifiers) const { if (modifiers) *modifiers = fModifiers; @@ -336,14 +336,14 @@ BMenuItem::Shortcut(uint32 *modifiers) const } -BMenu * +BMenu* BMenuItem::Submenu() const { return fSubmenu; } -BMenu * +BMenu* BMenuItem::Menu() const { return fSuper; @@ -369,9 +369,8 @@ BMenuItem::GetContentSize(float* width, float* height) if (width) *width = (float)ceil(fCachedWidth); - if (height) { + if (height) *height = MenuPrivate(fSuper).FontHeight(); - } } @@ -452,8 +451,7 @@ BMenuItem::Draw() bool selected = IsSelected(); // set low color and fill background if selected - bool activated = selected && (enabled || Submenu()) - /*&& fSuper->fRedrawAfterSticky*/; + bool activated = selected && (enabled || Submenu()); if (activated) { if (be_control_look != NULL) { BRect rect = Frame(); @@ -500,7 +498,7 @@ BMenuItem::Draw() void BMenuItem::Highlight(bool flag) { - Menu()->Invalidate(Frame()); + fSuper->Invalidate(Frame()); } @@ -514,10 +512,9 @@ BMenuItem::IsSelected() const BPoint BMenuItem::ContentLocation() const { - const BRect &padding = MenuPrivate(fSuper).Padding(); + const BRect& padding = MenuPrivate(fSuper).Padding(); - return BPoint(fBounds.left + padding.left, - fBounds.top + padding.top); + return BPoint(fBounds.left + padding.left, fBounds.top + padding.top); } @@ -532,7 +529,7 @@ BMenuItem::BMenuItem(const BMenuItem &) } -BMenuItem & +BMenuItem& BMenuItem::operator=(const BMenuItem &) { return *this; @@ -559,13 +556,13 @@ BMenuItem::_InitData() void -BMenuItem::_InitMenuData(BMenu *menu) +BMenuItem::_InitMenuData(BMenu* menu) { fSubmenu = menu; MenuPrivate(fSubmenu).SetSuperItem(this); - BMenuItem *item = menu->FindMarked(); + BMenuItem* item = menu->FindMarked(); if (menu->IsRadioMode() && menu->IsLabelFromMarked() && item != NULL) SetLabel(item->Label()); @@ -575,11 +572,10 @@ BMenuItem::_InitMenuData(BMenu *menu) void -BMenuItem::Install(BWindow *window) +BMenuItem::Install(BWindow* window) { - if (fSubmenu) { + if (fSubmenu != NULL) MenuPrivate(fSubmenu).Install(window); - } fWindow = window; @@ -592,7 +588,7 @@ BMenuItem::Install(BWindow *window) status_t -BMenuItem::Invoke(BMessage *message) +BMenuItem::Invoke(BMessage* message) { if (!IsEnabled()) return B_ERROR; @@ -606,21 +602,21 @@ BMenuItem::Invoke(BMessage *message) BMessage clone(kind); status_t err = B_BAD_VALUE; - if (!message && !notify) + if (message == NULL && !notify) message = Message(); - if (!message) { + if (message == NULL) { if (!fSuper->IsWatched()) return err; } else clone = *message; - clone.AddInt32("index", Menu()->IndexOf(this)); + clone.AddInt32("index", fSuper->IndexOf(this)); clone.AddInt64("when", (int64)system_time()); clone.AddPointer("source", this); clone.AddMessenger("be:sender", BMessenger(fSuper)); - if (message) + if (message != NULL) err = BInvoker::Invoke(&clone); // TODO: assynchronous messaging @@ -633,31 +629,32 @@ BMenuItem::Invoke(BMessage *message) void BMenuItem::Uninstall() { - if (fSubmenu != NULL) { + if (fSubmenu != NULL) MenuPrivate(fSubmenu).Uninstall(); - } if (Target() == fWindow) SetTarget(BMessenger()); if (fShortcutChar != 0 && (fModifiers & B_COMMAND_KEY) != 0 - && fWindow != NULL) + && fWindow != NULL) { fWindow->RemoveShortcut(fShortcutChar, fModifiers); + } fWindow = NULL; } void -BMenuItem::SetSuper(BMenu *super) +BMenuItem::SetSuper(BMenu* super) { - if (fSuper != NULL && super != NULL) - debugger("Error - can't add menu or menu item to more than 1 container (either menu or menubar)."); - - if (fSubmenu != NULL) { - MenuPrivate(fSubmenu).SetSuper(super); + if (fSuper != NULL && super != NULL) { + debugger("Error - can't add menu or menu item to more than 1 container" + " (either menu or menubar)."); } + if (fSubmenu != NULL) + MenuPrivate(fSubmenu).SetSuper(super); + fSuper = super; } @@ -668,7 +665,7 @@ BMenuItem::Select(bool selected) if (fSelected == selected) return; - if (Submenu() || IsEnabled()) { + if (Submenu() != NULL || IsEnabled()) { fSelected = selected; Highlight(selected); } @@ -717,7 +714,7 @@ BMenuItem::_DrawMarkSymbol() void BMenuItem::_DrawShortcutSymbol() { - BMenu *menu = Menu(); + BMenu* menu = fSuper; BFont font; menu->GetFont(&font); BPoint where = ContentLocation(); diff --git a/src/kits/interface/MenuPrivate.cpp b/src/kits/interface/MenuPrivate.cpp index 41303e6277..7e2d80f53d 100644 --- a/src/kits/interface/MenuPrivate.cpp +++ b/src/kits/interface/MenuPrivate.cpp @@ -97,7 +97,7 @@ BBitmap* MenuPrivate::sMenuItemAlt; BBitmap* MenuPrivate::sMenuItemMenu; -MenuPrivate::MenuPrivate(BMenu *menu) +MenuPrivate::MenuPrivate(BMenu* menu) : fMenu(menu) { @@ -147,22 +147,22 @@ MenuPrivate::Padding() const void -MenuPrivate::GetItemMargins(float *left, float *top, - float *right, float *bottom) const +MenuPrivate::GetItemMargins(float* left, float* top, float* right, + float* bottom) const { fMenu->GetItemMargins(left, top, right, bottom); } int -MenuPrivate::State(BMenuItem **item) const +MenuPrivate::State(BMenuItem** item) const { return fMenu->_State(item); } void -MenuPrivate::Install(BWindow *window) +MenuPrivate::Install(BWindow* window) { fMenu->_Install(window); } @@ -176,21 +176,21 @@ MenuPrivate::Uninstall() void -MenuPrivate::SetSuper(BMenu *menu) +MenuPrivate::SetSuper(BMenu* menu) { fMenu->fSuper = menu; } void -MenuPrivate::SetSuperItem(BMenuItem *item) +MenuPrivate::SetSuperItem(BMenuItem* item) { fMenu->fSuperitem = item; } void -MenuPrivate::InvokeItem(BMenuItem *item, bool now) +MenuPrivate::InvokeItem(BMenuItem* item, bool now) { fMenu->_InvokeItem(item, now); } From d5c51ba6768d7ffd5bb983af9ab97b6372eae134 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 16:53:21 -0400 Subject: [PATCH 040/136] Update header comments --- headers/os/interface/Menu.h | 2 +- headers/private/interface/BMCPrivate.h | 7 ++++--- src/kits/interface/BMCPrivate.cpp | 7 ++++--- src/kits/interface/Menu.cpp | 11 ++++++----- src/kits/interface/MenuItem.cpp | 9 +++++---- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/headers/os/interface/Menu.h b/headers/os/interface/Menu.h index 41a17fe78b..bbca5c4d6d 100644 --- a/headers/os/interface/Menu.h +++ b/headers/os/interface/Menu.h @@ -1,5 +1,5 @@ /* - * Copyright 2007-2009, Haiku, Inc. All rights reserved. + * Copyright 2007-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _MENU_H diff --git a/headers/private/interface/BMCPrivate.h b/headers/private/interface/BMCPrivate.h index f8ff7036ff..dd59c70bc2 100644 --- a/headers/private/interface/BMCPrivate.h +++ b/headers/private/interface/BMCPrivate.h @@ -1,10 +1,11 @@ /* - * Copyright 2001-2009 Haiku, Inc. All rights reserved. + * Copyright 2001-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: - * Marc Flerackers (mflerackers@androme.be) - * Stephan Aßmus + * Stephan Aßmus, superstippi@gmx.de + * Marc Flerackers, mflerackers@androme.be + * John Scipione, jscipione@gmail.com */ #ifndef _BMC_PRIVATE_H #define _BMC_PRIVATE_H diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index 25bfe2043a..512f69b95c 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -1,10 +1,11 @@ /* - * Copyright 2001-2009 Haiku, Inc. All rights reserved. + * Copyright 2001-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: - * Marc Flerackers (mflerackers@androme.be) - * Stephan Aßmus + * Stephan Aßmus, superstippi@gmx.de + * Marc Flerackers, mflerackers@androme.be + * John Scipione, jcipione@gmail.com */ diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index 76e1eb37e2..3b7bb02108 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -1,12 +1,13 @@ /* - * Copyright 2001-2011, Haiku Inc. All rights reserved. + * Copyright 2001-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT license. * * Authors: - * Marc Flerackers (mflerackers@androme.be) - * Stefano Ceccherini (stefano.ceccherini@gmail.com) - * Rene Gollent (anevilyak@gmail.com) - * Stephan Aßmus + * Stephan Aßmus, superstippi@gmx.de + * Stefano Ceccherini, stefano.ceccherini@gmail.com + * Marc Flerackers, mflerackers@androme.be + * Rene Gollent, anevilyak@gmail.com + * John Scipione, jscipione@gmail.com */ diff --git a/src/kits/interface/MenuItem.cpp b/src/kits/interface/MenuItem.cpp index 94d2d66138..7d2565a425 100644 --- a/src/kits/interface/MenuItem.cpp +++ b/src/kits/interface/MenuItem.cpp @@ -1,12 +1,13 @@ /* - * Copyright 2001-2008, Haiku, Inc. + * Copyright 2001-2013 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: - * Marc Flerackers (mflerackers@androme.be) - * Bill Hayden (haydentech@users.sourceforge.net) - * Stefano Ceccherini (stefano.ceccherini@gmail.com) + * Stefano Ceccherini, stefano.ceccherini@gmail.com + * Marc Flerackers, mflerackers@androme.be + * Bill Hayden, haydentech@users.sourceforge.net * Olivier Milla + * John Scipione, jscipione@gmail.com */ //! Display item for BMenu class From d218f0f822babcbc2b1dd15880440638c8ffe5b7 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 16:54:30 -0400 Subject: [PATCH 041/136] Put the BMenuBar initilization on it's own line --- src/kits/interface/BMCPrivate.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index 512f69b95c..78f769c22c 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -82,7 +82,8 @@ _BMCMenuBar_::_BMCMenuBar_(bool fixedSize, BMenuField* menuField) _BMCMenuBar_::_BMCMenuBar_(BMessage* data) - : BMenuBar(data), + : + BMenuBar(data), fMenuField(NULL), fFixedSize(true), fRunner(NULL), From 6c1452071c4b2220dcf554213c3cd1787f93f8e4 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 16:56:32 -0400 Subject: [PATCH 042/136] Remove pre-ControlLook drawing code in menu classes --- src/kits/interface/BMCPrivate.cpp | 125 ++++-------------------------- src/kits/interface/MenuBar.cpp | 42 ++-------- src/kits/interface/MenuItem.cpp | 13 +--- 3 files changed, 25 insertions(+), 155 deletions(-) diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index 78f769c22c..b6e6ef9748 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -136,119 +136,24 @@ _BMCMenuBar_::AttachedToWindow() void _BMCMenuBar_::Draw(BRect updateRect) { - if (be_control_look != NULL) { - BRect rect(Bounds()); - rgb_color base = ui_color(B_MENU_BACKGROUND_COLOR); - uint32 flags = 0; - if (!IsEnabled()) - flags |= BControlLook::B_DISABLED; - if (IsFocus()) - flags |= BControlLook::B_FOCUSED; - be_control_look->DrawMenuFieldBackground(this, rect, - updateRect, base, fShowPopUpMarker, flags); + float height; + GetPreferredSize(NULL, &height); + ResizeTo(fMenuField->_MenuBarWidth(), height); + // Set the width to the menu field width because the menubar + // bounds are expanded by the selected menu item. + BRect rect(Bounds()); - _DrawItems(updateRect); + rgb_color base = ui_color(B_MENU_BACKGROUND_COLOR); + uint32 flags = 0; + if (!IsEnabled()) + flags |= BControlLook::B_DISABLED; + if (IsFocus()) + flags |= BControlLook::B_FOCUSED; - return; - } + be_control_look->DrawMenuFieldBackground(this, rect, + updateRect, base, fShowPopUpMarker, flags); - if (!fShowPopUpMarker) { - BMenuBar::Draw(updateRect); - return; - } - - // draw the right side with the popup marker - - // prevent the original BMenuBar's Draw from - // drawing in those parts - BRect bounds(Bounds()); - bounds.right -= 10.0; - bounds.bottom -= 1.0; - - BRegion clipping(bounds); - ConstrainClippingRegion(&clipping); - - BMenuBar::Draw(updateRect); - - // restore clipping - ConstrainClippingRegion(NULL); - bounds.right += 10.0; - bounds.bottom += 1.0; - - // prepare some colors - rgb_color normalNoTint = LowColor(); - rgb_color noTint = tint_color(normalNoTint, 0.74); - rgb_color darken4; - rgb_color normalDarken4; - rgb_color darken1; - rgb_color lighten1; - rgb_color lighten2; - - if (IsEnabled()) { - darken4 = tint_color(noTint, B_DARKEN_4_TINT); - normalDarken4 = tint_color(normalNoTint, B_DARKEN_4_TINT); - darken1 = tint_color(noTint, B_DARKEN_1_TINT); - lighten1 = tint_color(noTint, B_LIGHTEN_1_TINT); - lighten2 = tint_color(noTint, B_LIGHTEN_2_TINT); - } else { - darken4 = tint_color(noTint, B_DARKEN_2_TINT); - normalDarken4 = tint_color(normalNoTint, B_DARKEN_2_TINT); - darken1 = tint_color(noTint, (B_NO_TINT + B_DARKEN_1_TINT) / 2.0); - lighten1 = tint_color(noTint, (B_NO_TINT + B_LIGHTEN_1_TINT) / 2.0); - lighten2 = tint_color(noTint, B_LIGHTEN_1_TINT); - } - - BRect r(bounds); - r.left = r.right - 10.0; - - BeginLineArray(6); - // bottom below item text, darker then BMenuBar - // would normaly draw it - AddLine(BPoint(bounds.left, r.bottom), - BPoint(r.left - 1.0, r.bottom), normalDarken4); - - // bottom below popup marker - AddLine(BPoint(r.left, r.bottom), - BPoint(r.right, r.bottom), darken4); - // right of popup marker - AddLine(BPoint(r.right, r.bottom - 1), - BPoint(r.right, r.top), darken4); - // top above popup marker - AddLine(BPoint(r.left, r.top), - BPoint(r.right - 2, r.top), lighten2); - - r.top += 1; - r.bottom -= 1; - r.right -= 1; - - // bottom below popup marker - AddLine(BPoint(r.left, r.bottom), - BPoint(r.right, r.bottom), darken1); - // right of popup marker - AddLine(BPoint(r.right, r.bottom - 1), - BPoint(r.right, r.top), darken1); - EndLineArray(); - - r.bottom -= 1; - r.right -= 1; - SetHighColor(noTint); - FillRect(r); - - // popup marker - BPoint center(roundf((r.left + r.right) / 2.0), - roundf((r.top + r.bottom) / 2.0)); - BPoint triangle[3]; - triangle[0] = center + BPoint(-2.5, -0.5); - triangle[1] = center + BPoint(2.5, -0.5); - triangle[2] = center + BPoint(0.0, 2.0); - - uint32 flags = Flags(); - SetFlags(flags | B_SUBPIXEL_PRECISE); - - SetHighColor(normalDarken4); - FillTriangle(triangle[0], triangle[1], triangle[2]); - - SetFlags(flags); + _DrawItems(updateRect); } diff --git a/src/kits/interface/MenuBar.cpp b/src/kits/interface/MenuBar.cpp index b582d87087..987f355404 100644 --- a/src/kits/interface/MenuBar.cpp +++ b/src/kits/interface/MenuBar.cpp @@ -279,44 +279,14 @@ BMenuBar::Draw(BRect updateRect) return; } - if (be_control_look != NULL) { - BRect rect(Bounds()); - rgb_color base = LowColor(); - uint32 flags = 0; + BRect rect(Bounds()); + rgb_color base = LowColor(); + uint32 flags = 0; - be_control_look->DrawBorder(this, rect, updateRect, base, - B_PLAIN_BORDER, flags, BControlLook::B_BOTTOM_BORDER); + be_control_look->DrawBorder(this, rect, updateRect, base, + B_PLAIN_BORDER, flags, BControlLook::B_BOTTOM_BORDER); - be_control_look->DrawMenuBarBackground(this, rect, updateRect, base); - - _DrawItems(updateRect); - return; - } - - // TODO: implement additional border styles - rgb_color color = HighColor(); - - BRect bounds(Bounds()); - // Restore the background of the previously selected menuitem - DrawBackground(bounds & updateRect); - - rgb_color noTint = LowColor(); - - SetHighColor(tint_color(noTint, B_LIGHTEN_2_TINT)); - StrokeLine(BPoint(0.0f, bounds.bottom - 2.0f), BPoint(0.0f, 0.0f)); - StrokeLine(BPoint(bounds.right, 0.0f)); - - SetHighColor(tint_color(noTint, B_DARKEN_1_TINT)); - StrokeLine(BPoint(1.0f, bounds.bottom - 1.0f), - BPoint(bounds.right, bounds.bottom - 1.0f)); - - SetHighColor(tint_color(noTint, B_DARKEN_2_TINT)); - StrokeLine(BPoint(0.0f, bounds.bottom), - BPoint(bounds.right, bounds.bottom)); - StrokeLine(BPoint(bounds.right, 0.0f), BPoint(bounds.right, bounds.bottom)); - - SetHighColor(color); - // revert to previous used color (cheap PushState()/PopState()) + be_control_look->DrawMenuBarBackground(this, rect, updateRect, base); _DrawItems(updateRect); } diff --git a/src/kits/interface/MenuItem.cpp b/src/kits/interface/MenuItem.cpp index 7d2565a425..1ab24907e4 100644 --- a/src/kits/interface/MenuItem.cpp +++ b/src/kits/interface/MenuItem.cpp @@ -454,15 +454,10 @@ BMenuItem::Draw() // set low color and fill background if selected bool activated = selected && (enabled || Submenu()); if (activated) { - if (be_control_look != NULL) { - BRect rect = Frame(); - be_control_look->DrawMenuItemBackground(fSuper, rect, rect, - ui_color(B_MENU_SELECTED_BACKGROUND_COLOR), - BControlLook::B_ACTIVATED); - } else { - fSuper->SetLowColor(ui_color(B_MENU_SELECTED_BACKGROUND_COLOR)); - fSuper->FillRect(Frame(), B_SOLID_LOW); - } + BRect rect = Frame(); + be_control_look->DrawMenuItemBackground(fSuper, rect, rect, + ui_color(B_MENU_SELECTED_BACKGROUND_COLOR), + BControlLook::B_ACTIVATED); } // set high color From 2bf1592a70d3f413132a0357213aa6be64077c5e Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 17:00:42 -0400 Subject: [PATCH 043/136] Rework layout-enabled contructor for BMCMenuBar Was passing !fixedSize into the view flags of BMenuBar, which made no sense. Stop doing that, set fixedSize to true instead. Remove the fixedSize parameter from this contructor, it's too late for that. --- headers/private/interface/BMCPrivate.h | 3 +-- src/kits/interface/BMCPrivate.cpp | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/headers/private/interface/BMCPrivate.h b/headers/private/interface/BMCPrivate.h index dd59c70bc2..3fe04cdaf3 100644 --- a/headers/private/interface/BMCPrivate.h +++ b/headers/private/interface/BMCPrivate.h @@ -37,8 +37,7 @@ class _BMCMenuBar_ : public BMenuBar { public: _BMCMenuBar_(BRect frame, bool fixedSize, BMenuField* menuField); - _BMCMenuBar_(bool fixedSize, - BMenuField* menuField); + _BMCMenuBar_(BMenuField* menuField); _BMCMenuBar_(BMessage* data); virtual ~_BMCMenuBar_(); diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index b6e6ef9748..05e36fcdac 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -69,11 +69,11 @@ _BMCMenuBar_::_BMCMenuBar_(BRect frame, bool fixedSize, BMenuField* menuField) } -_BMCMenuBar_::_BMCMenuBar_(bool fixedSize, BMenuField* menuField) +_BMCMenuBar_::_BMCMenuBar_(BMenuField* menuField) : - BMenuBar("_mc_mb_", B_ITEMS_IN_ROW, !fixedSize), + BMenuBar("_mc_mb_", B_ITEMS_IN_ROW), fMenuField(menuField), - fFixedSize(fixedSize), + fFixedSize(true), fRunner(NULL), fShowPopUpMarker(true) { From 4e1b19207ad7f4ef511c0503aae9ac3e8c0e1340 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 17:02:26 -0400 Subject: [PATCH 044/136] Refactor BMenuField::DrawLabel() also use std::max() instead of max_c() --- src/kits/interface/MenuField.cpp | 53 +++++++++++++++++--------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/kits/interface/MenuField.cpp b/src/kits/interface/MenuField.cpp index bda34a2f93..d82affed63 100644 --- a/src/kits/interface/MenuField.cpp +++ b/src/kits/interface/MenuField.cpp @@ -11,6 +11,7 @@ #include +#include #include #include @@ -987,35 +988,37 @@ BMenuField::DrawLabel(BRect bounds, BRect updateRect) _ValidateLayoutData(); font_height& fh = fLayoutData->font_info; - if (Label()) { - SetLowColor(ViewColor()); + const char* label = Label(); + if (label == NULL) + return; - // horizontal alignment - float x; - switch (fAlign) { - case B_ALIGN_RIGHT: - x = fDivider - fLayoutData->label_width - 3.0; - break; + SetLowColor(ViewColor()); - case B_ALIGN_CENTER: - x = fDivider - fLayoutData->label_width / 2.0; - break; + // horizontal alignment + float x; + switch (fAlign) { + case B_ALIGN_RIGHT: + x = fDivider - fLayoutData->label_width - 3.0; + break; - default: - x = 0.0; - break; - } + case B_ALIGN_CENTER: + x = fDivider - fLayoutData->label_width / 2.0; + break; - // vertical alignment - float y = Bounds().top - + (Bounds().Height() + 1 - fh.ascent - fh.descent) / 2 - + fh.ascent; - y = floor(y + 0.5); - - SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), - IsEnabled() ? B_DARKEN_MAX_TINT : B_DISABLED_LABEL_TINT)); - DrawString(Label(), BPoint(x, y)); + default: + x = 0.0; + break; } + + // vertical alignment + float y = Bounds().top + + (Bounds().Height() + 1 - fh.ascent - fh.descent) / 2 + + fh.ascent; + y = floor(y + 0.5); + + SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), + IsEnabled() ? B_DARKEN_MAX_TINT : B_DISABLED_LABEL_TINT)); + DrawString(label, BPoint(x, y)); } @@ -1228,7 +1231,7 @@ BMenuField::_ValidateLayoutData() float BMenuField::_MenuBarOffset() const { - return max_c(kVMargin, fDivider + kVMargin); + return std::max(fDivider + kVMargin, kVMargin); } From 1afff67178d334197c16354e8a704d99d2fded51 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 17:04:27 -0400 Subject: [PATCH 045/136] Set some static variables for magic number constants --- src/kits/interface/BMCPrivate.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index 05e36fcdac..54240fe715 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -23,6 +23,10 @@ #include +static const float kPopUpIndicatorWidth = 10.0f; +static const float kMarginWidth = 3.0f; + + _BMCFilter_::_BMCFilter_(BMenuField* menuField, uint32 what) : BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE, what), @@ -271,7 +275,7 @@ _BMCMenuBar_::MinSize() if (fShowPopUpMarker) { // account for popup indicator + a few pixels margin - size.width += 13.0; + size.width += kPopUpIndicatorWidth + kMarginWidth; } return BLayoutUtils::ComposeSize(ExplicitMinSize(), size); @@ -317,7 +321,9 @@ _BMCMenuBar_::_Init(bool setMaxContentWidth) if (be_control_look != NULL) left = right = be_control_look->DefaultLabelSpacing(); - SetItemMargins(left, top, right + fShowPopUpMarker ? 10 : 0, bottom); + SetItemMargins(left, top, + right + fShowPopUpMarker ? kPopUpIndicatorWidth + kMarginWidth : 0, + bottom); fPreviousWidth = Bounds().Width(); From c33396629144d09d2efb678e0d7f97290e69b1ac Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 17:13:40 -0400 Subject: [PATCH 046/136] Draw truncated menu label in BMCPrivate, fixes #9735 ...instead of in BMenuItem and remove the truncation code from BMenuItem. The label truncation code cannot work in BMenuItem because the super menu helpfully resizes itself to fit the menu item. So, instead we do the label truncation in BMCPrivate making sure that BMenuItem there can't expand the BMCMenuBar because we set the width to fMenuField->_MenuBarWidth() explicity. Note that this only truncates the label in BMCMenuField, i.e. the label inside the menufield, it does nothing to the labels of the menu items in the attached BMenu or BPopUpMenu which is exactly what we want. --- headers/private/interface/BMCPrivate.h | 2 + src/kits/interface/BMCPrivate.cpp | 59 ++++++++++++++++++++++++++ src/kits/interface/MenuItem.cpp | 21 +-------- 3 files changed, 62 insertions(+), 20 deletions(-) diff --git a/headers/private/interface/BMCPrivate.h b/headers/private/interface/BMCPrivate.h index 3fe04cdaf3..f3fea82fc2 100644 --- a/headers/private/interface/BMCPrivate.h +++ b/headers/private/interface/BMCPrivate.h @@ -62,6 +62,8 @@ private: void _Init(bool setMaxContentWidth); + void _DrawItems(BRect updateRect); + BMenuField* fMenuField; bool fFixedSize; BMessageRunner* fRunner; diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index 54240fe715..09d99b5139 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -12,16 +12,21 @@ #include #include +#include #include +#include #include #include #include #include #include #include +#include #include +#include + static const float kPopUpIndicatorWidth = 10.0f; static const float kMarginWidth = 3.0f; @@ -59,6 +64,7 @@ _BMCFilter_::Filter(BMessage* message, BHandler** handler) // #pragma mark - +using BPrivate::MenuPrivate; _BMCMenuBar_::_BMCMenuBar_(BRect frame, bool fixedSize, BMenuField* menuField) : @@ -331,3 +337,56 @@ _BMCMenuBar_::_Init(bool setMaxContentWidth) SetMaxContentWidth(fPreviousWidth - (left + right)); } + +void +_BMCMenuBar_::_DrawItems(BRect updateRect) +{ + MenuPrivate menuPrivate(this); + menuPrivate.CacheFontInfo(); + const BRect& padding = menuPrivate.Padding(); + float frameWidth = fMenuField->_MenuBarWidth() + - (padding.left + padding.right); + int32 itemCount = CountItems(); + + for (int32 i = 0; i < itemCount; i++) { + BMenuItem* item = ItemAt(i); + if (item == NULL) + continue; + + if (!item->Frame().Intersects(updateRect)) + continue; + + const char* label = item->Label(); + if (label == NULL) + continue; + + BPoint contentLocation(item->Frame().left + padding.left, + item->Frame().top + padding.top); + MovePenTo(contentLocation); + MovePenBy(0, menuPrivate.Ascent()); + + if (item->IsEnabled()) + SetHighColor(ui_color(B_MENU_ITEM_TEXT_COLOR)); + else + SetHighColor(tint_color(LowColor(), B_DISABLED_LABEL_TINT)); + + SetDrawingMode(B_OP_OVER); + + if (frameWidth >= StringWidth(label)) + DrawString(label); + else { + // truncate label to fit + char* truncatedLabel = new char[strlen(label) + 4]; + BFont font; + GetFont(&font); + BString labelString(label); + font.TruncateString(&labelString, B_TRUNCATE_MIDDLE, frameWidth); + labelString.CopyInto(truncatedLabel, 0, labelString.Length()); + truncatedLabel[labelString.Length()] = '\0'; + DrawString(truncatedLabel); + delete[] truncatedLabel; + } + + SetDrawingMode(B_OP_COPY); + } +} diff --git a/src/kits/interface/MenuItem.cpp b/src/kits/interface/MenuItem.cpp index 1ab24907e4..fb79e1bc8f 100644 --- a/src/kits/interface/MenuItem.cpp +++ b/src/kits/interface/MenuItem.cpp @@ -399,28 +399,9 @@ BMenuItem::DrawContent() fSuper->MovePenBy(0, menuPrivate.Ascent()); BPoint lineStart = fSuper->PenLocation(); - float labelWidth, labelHeight; - GetContentSize(&labelWidth, &labelHeight); - fSuper->SetDrawingMode(B_OP_OVER); - float frameWidth = fBounds.Width(); - if (menuPrivate.State() == MENU_STATE_CLOSED) { - float leftMargin; - float rightMargin; - menuPrivate.GetItemMargins(&leftMargin, NULL, &rightMargin, NULL); - frameWidth = fSuper->Frame().Width() - rightMargin + leftMargin; - } - - if (frameWidth >= labelWidth) - fSuper->DrawString(fLabel); - else { - // truncate the label to fit - char* truncatedLabel = new char[strlen(fLabel) + 4]; - TruncateLabel(frameWidth, truncatedLabel); - fSuper->DrawString(truncatedLabel); - delete[] truncatedLabel; - } + fSuper->DrawString(fLabel); if (fSuper->AreTriggersEnabled() && fTriggerIndex != -1) { float escapements[fTriggerIndex + 1]; From 13cec3021167821f38dbd64e0bfda69a8c5c3a9c Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 17:23:59 -0400 Subject: [PATCH 047/136] Find: set a max width on each of the menu fields ... instead of the just on the mime type menu now that menu field truncation is working. This will prevent the volume menu growing too wide as well. --- src/kits/tracker/FindPanel.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/kits/tracker/FindPanel.cpp b/src/kits/tracker/FindPanel.cpp index f42c7ddc64..51790537eb 100644 --- a/src/kits/tracker/FindPanel.cpp +++ b/src/kits/tracker/FindPanel.cpp @@ -862,9 +862,7 @@ FindPanel::FindPanel(BFile* node, FindWindow* parent, bool fromTemplate, else AddByAttributeItems(node); - fMimeTypeField->SetExplicitSize( - BSize(be_control_look->DefaultItemSpacing() * 20, B_SIZE_UNSET)); - // ResizeMenuField() makes fMimeTypeField too wide. + ResizeMenuField(fMimeTypeField); ResizeMenuField(searchModeField); ResizeMenuField(volumeField); } @@ -972,7 +970,8 @@ FindPanel::ResizeMenuField(BMenuField* menuField) } } - size.width = width + padding; + float maxWidth = be_control_look->DefaultItemSpacing() * 20; + size.width = std::min(width + padding, maxWidth); menuField->SetExplicitSize(size); } From c1a7e89fc235363e91d79eb547e92e9e16efd5e5 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 17:55:33 -0400 Subject: [PATCH 048/136] Put the label truncation code back in BMenuItem. Just a few commits ago I moved the label truncation code out of BMenuItem and into BMCMenuBar because the truncation had to happen outside of BMenuItem. Turns out, that wasn't true so I'm moving the label truncation back into BMenuItem and removing the _DrawItems() method from BMCMenuBar. Note that the code is not a copy of what was there before, but, the updated version I created for BMCMenuBar. The main difference is that I use menuPrivate.Padding() instead of GetItemMargins() and I always use the width of the parent menu frame instead of using fBounds even if the state is not MENU_STATE_CLOSED. These are changes needed for BMCMenuBar but should work just as well for a regular BMenu. --- headers/private/interface/BMCPrivate.h | 2 - src/kits/interface/BMCPrivate.cpp | 54 -------------------------- src/kits/interface/MenuItem.cpp | 17 +++++++- 3 files changed, 16 insertions(+), 57 deletions(-) diff --git a/headers/private/interface/BMCPrivate.h b/headers/private/interface/BMCPrivate.h index f3fea82fc2..3fe04cdaf3 100644 --- a/headers/private/interface/BMCPrivate.h +++ b/headers/private/interface/BMCPrivate.h @@ -62,8 +62,6 @@ private: void _Init(bool setMaxContentWidth); - void _DrawItems(BRect updateRect); - BMenuField* fMenuField; bool fFixedSize; BMessageRunner* fRunner; diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index 09d99b5139..d3743b12ca 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -336,57 +336,3 @@ _BMCMenuBar_::_Init(bool setMaxContentWidth) if (setMaxContentWidth) SetMaxContentWidth(fPreviousWidth - (left + right)); } - - -void -_BMCMenuBar_::_DrawItems(BRect updateRect) -{ - MenuPrivate menuPrivate(this); - menuPrivate.CacheFontInfo(); - const BRect& padding = menuPrivate.Padding(); - float frameWidth = fMenuField->_MenuBarWidth() - - (padding.left + padding.right); - int32 itemCount = CountItems(); - - for (int32 i = 0; i < itemCount; i++) { - BMenuItem* item = ItemAt(i); - if (item == NULL) - continue; - - if (!item->Frame().Intersects(updateRect)) - continue; - - const char* label = item->Label(); - if (label == NULL) - continue; - - BPoint contentLocation(item->Frame().left + padding.left, - item->Frame().top + padding.top); - MovePenTo(contentLocation); - MovePenBy(0, menuPrivate.Ascent()); - - if (item->IsEnabled()) - SetHighColor(ui_color(B_MENU_ITEM_TEXT_COLOR)); - else - SetHighColor(tint_color(LowColor(), B_DISABLED_LABEL_TINT)); - - SetDrawingMode(B_OP_OVER); - - if (frameWidth >= StringWidth(label)) - DrawString(label); - else { - // truncate label to fit - char* truncatedLabel = new char[strlen(label) + 4]; - BFont font; - GetFont(&font); - BString labelString(label); - font.TruncateString(&labelString, B_TRUNCATE_MIDDLE, frameWidth); - labelString.CopyInto(truncatedLabel, 0, labelString.Length()); - truncatedLabel[labelString.Length()] = '\0'; - DrawString(truncatedLabel); - delete[] truncatedLabel; - } - - SetDrawingMode(B_OP_COPY); - } -} diff --git a/src/kits/interface/MenuItem.cpp b/src/kits/interface/MenuItem.cpp index fb79e1bc8f..c27645e336 100644 --- a/src/kits/interface/MenuItem.cpp +++ b/src/kits/interface/MenuItem.cpp @@ -401,7 +401,22 @@ BMenuItem::DrawContent() fSuper->SetDrawingMode(B_OP_OVER); - fSuper->DrawString(fLabel); + float labelWidth; + float labelHeight; + GetContentSize(&labelWidth, &labelHeight); + + const BRect& padding = menuPrivate.Padding(); + float frameWidth = fSuper->Frame().Width() - padding.left - padding.right; + + if (frameWidth >= labelWidth) + fSuper->DrawString(fLabel); + else { + // truncate label to fit + char* truncatedLabel = new char[strlen(fLabel) + 4]; + TruncateLabel(frameWidth, truncatedLabel); + fSuper->DrawString(truncatedLabel); + delete[] truncatedLabel; + } if (fSuper->AreTriggersEnabled() && fTriggerIndex != -1) { float escapements[fTriggerIndex + 1]; From e28ba280de24a60949104e5c468a4c8c8687ce8b Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 18:29:34 -0400 Subject: [PATCH 049/136] BMCPrivate: Cleanup Remove no longer needed header includes, most that I recently added a few that were already there but just aren't needed anymore. Don't use BPrivate::MenuPrivate namespace. --- headers/private/interface/BMCPrivate.h | 4 ++-- src/kits/interface/BMCPrivate.cpp | 9 --------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/headers/private/interface/BMCPrivate.h b/headers/private/interface/BMCPrivate.h index 3fe04cdaf3..5c9678c388 100644 --- a/headers/private/interface/BMCPrivate.h +++ b/headers/private/interface/BMCPrivate.h @@ -13,9 +13,9 @@ #include #include -#include #include + class BMessageRunner; @@ -54,7 +54,7 @@ public: bool IsPopUpMarkerShown() const { return fShowPopUpMarker; } - virtual BSize MinSize(); + virtual BSize MinSize(); virtual BSize MaxSize(); private: diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index d3743b12ca..79847f1b57 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -11,22 +11,14 @@ #include -#include -#include - #include -#include #include #include #include #include #include -#include -#include #include -#include - static const float kPopUpIndicatorWidth = 10.0f; static const float kMarginWidth = 3.0f; @@ -64,7 +56,6 @@ _BMCFilter_::Filter(BMessage* message, BHandler** handler) // #pragma mark - -using BPrivate::MenuPrivate; _BMCMenuBar_::_BMCMenuBar_(BRect frame, bool fixedSize, BMenuField* menuField) : From 4efba5fd996ef17b9758fc2204cb559bbac5195d Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Mon, 6 May 2013 18:47:17 -0400 Subject: [PATCH 050/136] Use default spacing for inspector's groups too. --- .../user_interface/gui/inspector_window/InspectorWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp index e3917f88fe..1293e2f6ad 100644 --- a/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp +++ b/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp @@ -126,7 +126,7 @@ InspectorWindow::_Init() BLayoutBuilder::Group<>(this, B_VERTICAL) .SetInsets(B_USE_DEFAULT_SPACING) - .AddGroup(B_HORIZONTAL, 4.0f) + .AddGroup(B_HORIZONTAL) .Add(fAddressInput = new BTextControl("addrInput", "Target Address:", "", new BMessage(MSG_INSPECT_ADDRESS))) @@ -135,7 +135,7 @@ InspectorWindow::_Init() .Add(fNextBlockButton = new BButton("navNext", ">", new BMessage(MSG_NAVIGATE_NEXT_BLOCK))) .End() - .AddGroup(B_HORIZONTAL, 4.0f) + .AddGroup(B_HORIZONTAL) .Add(fHexMode = new BMenuField("hexMode", "Hex Mode:", hexMenu)) .AddGlue() From 6ba46ced853e1a8ee1bc271eebf0e1e58100bb4e Mon Sep 17 00:00:00 2001 From: John Scipione Date: Mon, 6 May 2013 21:14:23 -0400 Subject: [PATCH 051/136] Reinit offscreen bitmap when set keyboard layout Fixes #9345 --- src/preferences/keymap/KeyboardLayoutView.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/preferences/keymap/KeyboardLayoutView.cpp b/src/preferences/keymap/KeyboardLayoutView.cpp index 82f3a31dfa..5a8fa79bc8 100644 --- a/src/preferences/keymap/KeyboardLayoutView.cpp +++ b/src/preferences/keymap/KeyboardLayoutView.cpp @@ -56,6 +56,7 @@ void KeyboardLayoutView::SetKeyboardLayout(KeyboardLayout* layout) { fLayout = layout; + _InitOffscreen(); _LayoutKeyboard(); Invalidate(); } From df720531e35c3f78df963af874ddf11970deaebe Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Tue, 7 May 2013 22:59:00 -0400 Subject: [PATCH 052/136] Use B_USE_SMALL_{SPACING,INSETS} as suggested by Axel. --- .../user_interface/gui/team_window/TeamWindow.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp index 2c8ddf6c25..a23c8216a0 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp @@ -764,10 +764,10 @@ TeamWindow::_Init() .Add(fMenuBar = new BMenuBar("Menu")) .AddSplit(B_VERTICAL, 3.0f) .GetSplitView(&fFunctionSplitView) - .SetInsets(4.0f, 4.0f, 4.0f, 4.0f) + .SetInsets(B_USE_SMALL_INSETS) .Add(fTabView = new BTabView("tab view"), 0.4f) - .AddGroup(B_VERTICAL, 4.0f) - .AddGroup(B_HORIZONTAL, 4.0f) + .AddGroup(B_VERTICAL, B_USE_SMALL_SPACING) + .AddGroup(B_HORIZONTAL, B_USE_SMALL_SPACING) .Add(fRunButton = new BButton("Run")) .Add(fStepOverButton = new BButton("Step Over")) .Add(fStepIntoButton = new BButton("Step Into")) @@ -808,11 +808,12 @@ TeamWindow::_Init() .Add(fImageFunctionsView = ImageFunctionsView::Create(this)); // add breakpoints tab - BGroupView* breakpointsGroup = new BGroupView(B_HORIZONTAL, 4.0f); + BGroupView* breakpointsGroup = new BGroupView(B_HORIZONTAL, + B_USE_SMALL_SPACING); breakpointsGroup->SetName("Breakpoints"); fTabView->AddTab(breakpointsGroup); BLayoutBuilder::Group<>(breakpointsGroup) - .SetInsets(4.0f, 4.0f, 4.0f, 4.0f) + .SetInsets(B_USE_SMALL_INSETS) .Add(fBreakpointsView = BreakpointsView::Create(fTeam, this)); // add local variables tab From a130bab351822fb76ee1750cd4af6ba11ad70bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Wed, 8 May 2013 20:10:33 +0200 Subject: [PATCH 053/136] ext2: fixes 64 bit warnings --- .../kernel/file_systems/ext2/Attribute.cpp | 2 +- .../kernel/file_systems/ext2/BitmapBlock.cpp | 106 ++++++++------ .../file_systems/ext2/BlockAllocator.cpp | 128 +++++++++-------- .../kernel/file_systems/ext2/DataStream.cpp | 114 +++++++-------- .../file_systems/ext2/DirectoryIterator.cpp | 56 ++++---- .../kernel/file_systems/ext2/ExtentStream.cpp | 89 ++++++------ .../kernel/file_systems/ext2/HTree.cpp | 9 +- .../file_systems/ext2/HTreeEntryIterator.cpp | 53 +++---- .../file_systems/ext2/HashRevokeManager.cpp | 8 +- .../kernel/file_systems/ext2/Inode.cpp | 80 ++++++----- src/add-ons/kernel/file_systems/ext2/Inode.h | 8 +- .../file_systems/ext2/InodeAllocator.cpp | 24 ++-- .../kernel/file_systems/ext2/Journal.cpp | 132 ++++++++++-------- .../kernel/file_systems/ext2/NoJournal.cpp | 6 +- .../file_systems/ext2/RevokeManager.cpp | 10 +- .../kernel/file_systems/ext2/Transaction.cpp | 8 +- .../kernel/file_systems/ext2/Volume.cpp | 50 ++++--- src/add-ons/kernel/file_systems/ext2/ext2.h | 3 - .../file_systems/ext2/kernel_interface.cpp | 29 ++-- 19 files changed, 494 insertions(+), 421 deletions(-) diff --git a/src/add-ons/kernel/file_systems/ext2/Attribute.cpp b/src/add-ons/kernel/file_systems/ext2/Attribute.cpp index 746b13ad9c..713d8b23fc 100644 --- a/src/add-ons/kernel/file_systems/ext2/Attribute.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Attribute.cpp @@ -211,7 +211,7 @@ Attribute::Read(attr_cookie* cookie, off_t pos, uint8* buffer, size_t* _length) start += EXT2_INODE_NORMAL_SIZE + fInode->Node().ExtraInodeSize() + sizeof(uint32); pos += fBodyEntry->ValueOffset(); - if ((pos + length) > (end - start) || length > fBodyEntry->ValueSize()) + if ((off_t)(pos + length) > (end - start) || length > fBodyEntry->ValueSize()) return ERANGE; } memcpy(buffer, start + (uint32)pos, length); diff --git a/src/add-ons/kernel/file_systems/ext2/BitmapBlock.cpp b/src/add-ons/kernel/file_systems/ext2/BitmapBlock.cpp index a048eb25f0..fcd5147640 100644 --- a/src/add-ons/kernel/file_systems/ext2/BitmapBlock.cpp +++ b/src/add-ons/kernel/file_systems/ext2/BitmapBlock.cpp @@ -28,7 +28,7 @@ BitmapBlock::BitmapBlock(Volume* volume, uint32 numBits) fNumBits(numBits), fMaxIndex(fNumBits >> 5) { - TRACE("BitmapBlock::BitmapBlock(): num bits: %lu\n", fNumBits); + TRACE("BitmapBlock::BitmapBlock(): num bits: %" B_PRIu32 "\n", fNumBits); } @@ -95,7 +95,8 @@ BitmapBlock::_Check(uint32 start, uint32 length, bool marked) uint32 bits = B_LENDIAN_TO_HOST_INT32(data[index]); if ((bits & mask) != (marked ? mask : 0)) { - TRACE("BitmapBlock::_Check(): start %lx mask %lx\n", bits, mask); + TRACE("BitmapBlock::_Check(): start %" B_PRIx32 " mask %" B_PRIx32 + "\n", bits, mask); return false; } @@ -105,8 +106,8 @@ BitmapBlock::_Check(uint32 start, uint32 length, bool marked) for (; iterations > 0; --iterations) { if (data[index++] != (marked ? 0xFFFFFFFF : 0)) { - TRACE("BitmapBlock::_Check(): iterations %lu bits: %lX\n", iterations, - data[index - 1]); + TRACE("BitmapBlock::_Check(): iterations %" B_PRIu32 " bits: %" + B_PRIx32 "\n", iterations, data[index - 1]); return false; } } @@ -116,8 +117,9 @@ BitmapBlock::_Check(uint32 start, uint32 length, bool marked) uint32 bits = B_LENDIAN_TO_HOST_INT32(data[index]); if ((bits & mask) != (marked ? mask : 0)) { - TRACE("BitmapBlock::_Check(): remainingBits %ld remaining %lX mask %lX\n", - remainingBits, bits, mask); + TRACE("BitmapBlock::_Check(): remainingBits %" B_PRIu32 + " remaining %" B_PRIx32 " mask %" B_PRIx32 "\n", remainingBits, + bits, mask); return false; } } @@ -129,8 +131,8 @@ BitmapBlock::_Check(uint32 start, uint32 length, bool marked) bool BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force) { - TRACE("BitmapBlock::_Update(%lu, %lu, %c, %c)\n", start, length, - unmark ? 't' : 'f', force ? 't' : 'f'); + TRACE("BitmapBlock::_Update(%" B_PRIu32 ", %" B_PRIu32 ", %c, %c)\n", + start, length, mark ? 't' : 'f', force ? 't' : 'f'); if (fData == NULL || start + length > fNumBits) return false; @@ -139,23 +141,24 @@ BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force) uint32 startBit = start & 0x1F; uint32 remainingBits = (length + startBit) & 0x1F; - TRACE("BitmapBlock::_Update(): start index: %lu, start bit: %lu, remaining " - "bits: %lu)\n", startIndex, startBit, remainingBits); + TRACE("BitmapBlock::_Update(): start index: %" B_PRIu32 ", start bit: %" + B_PRIu32 ", remaining bits: %" B_PRIu32 ")\n", startIndex, startBit, + remainingBits); uint32 iterations; if (length < 32) { if (startBit + length < 32) { uint32 bits = B_LENDIAN_TO_HOST_INT32(fData[startIndex]); - TRACE("BitmapBlock::_Update(): bits: %lx\n", bits); + TRACE("BitmapBlock::_Update(): bits: %" B_PRIx32 "\n", bits); uint32 mask = (1 << (startBit + length)) - 1; mask &= ~((1 << startBit) - 1); - TRACE("BitmapBlock::_Update(): mask: %lx\n", mask); + TRACE("BitmapBlock::_Update(): mask: %" B_PRIx32 "\n", mask); if ((bits & mask) != (mark ? 0 : mask)) { - ERROR("BitmapBlock::_Update() Marking failed bits %lx " - "startBit %ld\n", bits, startBit); + ERROR("BitmapBlock::_Update() Marking failed bits %" B_PRIx32 + " startBit %" B_PRIu32 "\n", bits, startBit); return false; } @@ -164,7 +167,8 @@ BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force) else bits &= ~mask; - TRACE("BitmapBlock::_Update(): updated bits: %lx\n", bits); + TRACE("BitmapBlock::_Update(): updated bits: %" B_PRIx32 "\n", + bits); fData[startIndex] = B_HOST_TO_LENDIAN_INT32(bits); return true; @@ -173,14 +177,15 @@ BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force) } else iterations = (length - 32 + startBit) >> 5; - TRACE("BitmapBlock::_Update(): iterations: %lu\n", iterations); + TRACE("BitmapBlock::_Update(): iterations: %" B_PRIu32 "\n", iterations); uint32 index = startIndex; if (startBit != 0) { uint32 mask = ~((1 << startBit) - 1); uint32 bits = B_LENDIAN_TO_HOST_INT32(fData[index]); - TRACE("BitmapBlock::_Update(): mask: %lx, bits: %lx\n", mask, bits); + TRACE("BitmapBlock::_Update(): mask: %" B_PRIx32 ", bits: %" B_PRIx32 + "\n", mask, bits); if (!force && (bits & mask) != (mark ? 0 : mask)) return false; @@ -191,7 +196,7 @@ BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force) bits &= ~mask; fData[index] = B_HOST_TO_LENDIAN_INT32(bits); - TRACE("BitmapBlock::_Update(): updated bits: %lx\n", bits); + TRACE("BitmapBlock::_Update(): updated bits: %" B_PRIx32 "\n", bits); index += 1; } else iterations++; @@ -199,7 +204,8 @@ BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force) for (; iterations > 0; --iterations) { if (!force && fData[index] != (mark ? 0 : 0xFFFFFFFF)) { ERROR("BitmapBlock::_Update() Marking failed " - "index %ld, iterations %ld\n", index, iterations); + "index %" B_PRIu32 ", iterations %" B_PRId32 "\n", index, + iterations); return false; } fData[index++] = (mark ? 0xFFFFFFFF : 0); @@ -211,7 +217,8 @@ BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force) uint32 mask = (1 << remainingBits) - 1; uint32 bits = B_LENDIAN_TO_HOST_INT32(fData[index]); - TRACE("BitmapBlock::_Update(): mask: %lx, bits: %lx\n", mask, bits); + TRACE("BitmapBlock::_Update(): mask: %" B_PRIx32 ", bits: %" B_PRIx32 + "\n", mask, bits); if (!force && (bits & mask) != (mark ? 0 : mask)) { ERROR("BitmapBlock::_Update() Marking failed remaining\n"); @@ -224,7 +231,7 @@ BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force) bits &= ~mask; fData[index] = B_HOST_TO_LENDIAN_INT32(bits); - TRACE("BitmapBlock::_Update(): updated bits: %lx\n", bits); + TRACE("BitmapBlock::_Update(): updated bits: %" B_PRIx32 "\n", bits); } return true; @@ -234,7 +241,7 @@ BitmapBlock::_Update(uint32 start, uint32 length, bool mark, bool force) void BitmapBlock::_FindNext(uint32& pos, bool marked) { - TRACE("BitmapBlock::_FindNext(): pos: %lu\n", pos); + TRACE("BitmapBlock::_FindNext(): pos: %" B_PRIu32 "\n", pos); const uint32* data = fData == NULL ? fReadOnlyData : fData; if (data == NULL) @@ -252,8 +259,9 @@ BitmapBlock::_FindNext(uint32& pos, bool marked) uint32 mask = ~((1 << bit) - 1); uint32 bits = B_LENDIAN_TO_HOST_INT32(data[index]); - TRACE("BitmapBlock::_FindNext(): index: %lu, bit: %lu, mask: %lX, " - "bits: %lX\n", index, bit, mask, bits); + TRACE("BitmapBlock::_FindNext(): index: %" B_PRIu32 ", bit: %" B_PRIu32 + ", mask: %" B_PRIx32 ", bits: %" B_PRIx32 "\n", index, bit, mask, + bits); bits &= mask; if (bits == (marked ? 0 : mask) && index < fMaxIndex) { @@ -271,7 +279,7 @@ BitmapBlock::_FindNext(uint32& pos, bool marked) if (maxBit == 0) { // Not found TRACE("BitmapBlock::_FindNext(): reached end of block, " - "num bits: %lu\n", fNumBits); + "num bits: %" B_PRIu32 "\n", fNumBits); pos = fNumBits; return; } @@ -279,7 +287,7 @@ BitmapBlock::_FindNext(uint32& pos, bool marked) mask &= (1 << maxBit) - 1; if ((bits & mask) == (marked ? 0 : mask)) { TRACE("BitmapBlock::_FindNext(): reached end of block, " - "num bits: %lu\n", fNumBits); + "num bits: %" B_PRIu32 "\n", fNumBits); pos = fNumBits; return; } @@ -291,19 +299,19 @@ BitmapBlock::_FindNext(uint32& pos, bool marked) // Find the marked bit if ((bits >> bit & 1) != (marked ? 0U : 1U)) { pos = index << 5 | bit; - TRACE("BitmapBlock::_FindNext(): found bit: %lu\n", pos); + TRACE("BitmapBlock::_FindNext(): found bit: %" B_PRIu32 "\n", pos); return; } } - panic("Couldn't find bit inside an uint32 (%lx)\n", bits); + panic("Couldn't find bit inside an uint32 (%" B_PRIx32 ")\n", bits); } void BitmapBlock::FindPreviousMarked(uint32& pos) { - TRACE("BitmapBlock::FindPreviousMarked(%lu)\n", pos); + TRACE("BitmapBlock::FindPreviousMarked(%" B_PRIu32 ")\n", pos); const uint32* data = fData == NULL ? fReadOnlyData : fData; if (data == NULL) return; @@ -321,8 +329,8 @@ BitmapBlock::FindPreviousMarked(uint32& pos) uint32 bits = B_LENDIAN_TO_HOST_INT32(data[index]); bits = bits & mask; - TRACE("BitmapBlock::FindPreviousMarked(): index: %lu bit: %lu bits: %lx\n", - index, bit, bits); + TRACE("BitmapBlock::FindPreviousMarked(): index: %" B_PRIu32 " bit: %" + B_PRIu32 " bits: %" B_PRIx32 "\n", index, bit, bits); if (bits == 0) { // Find an block of 32 bits that has a marked bit @@ -340,8 +348,8 @@ BitmapBlock::FindPreviousMarked(uint32& pos) bit = 31; } - TRACE("BitmapBlock::FindPreviousMarked(): index: %lu bit: %lu bits: %lx\n", - index, bit, bits); + TRACE("BitmapBlock::FindPreviousMarked(): index: %" B_PRIu32 " bit: %" + B_PRIu32 " bits: %" B_PRIx32 "\n", index, bit, bits); for (; bit >= 0; --bit) { // Find the marked bit @@ -368,9 +376,10 @@ BitmapBlock::FindLargestUnmarkedRange(uint32& start, uint32& length) uint32 index = 0; uint32 bits = B_LENDIAN_TO_HOST_INT32(data[0]); - TRACE("BitmapBlock::FindLargestUnmarkedRange(): word span: %lu, last " - "index: %lu, start index: %lu, index: %lu, bits: %lX, start: %lu, " - "length: %lu\n", wordSpan, fMaxIndex, startIndex, index, bits, start, + TRACE("BitmapBlock::FindLargestUnmarkedRange(): word span: %" B_PRIu32 + ", last index: %" B_PRIu32 ", start index: %" B_PRIu32 ", index: %" + B_PRIu32 ", bits: %" B_PRIx32 ", start: %" B_PRIu32 ", length: %" + B_PRIu32 "\n", wordSpan, fMaxIndex, startIndex, index, bits, start, length); if (wordSpan == 0) { @@ -390,7 +399,8 @@ BitmapBlock::FindLargestUnmarkedRange(uint32& start, uint32& length) start = startPos; length = newLength; TRACE("BitmapBlock::FindLargestUnmarkedRange(): Found " - "larger length %lu starting at %lu\n", length, start); + "larger length %" B_PRIu32 " starting at %" B_PRIu32 + "\n", length, start); } startPos = endPos; @@ -442,8 +452,9 @@ BitmapBlock::FindLargestUnmarkedRange(uint32& start, uint32& length) wordSpan = length >> 5; TRACE("BitmapBlock::FindLargestUnmarkedRange(): Found " - "larger length %lu starting at %lu; word span: " - "%lu\n", length, start, wordSpan); + "larger length %" B_PRIu32 " starting at %" B_PRIu32 + "; word span: %" B_PRIu32 "\n", length, start, + wordSpan); } } @@ -458,15 +469,16 @@ BitmapBlock::FindLargestUnmarkedRange(uint32& start, uint32& length) uint32 newStart = (startIndex + 1) << 5; TRACE("BitmapBlock::FindLargestUnmarkedRange(): Possibly found a " - "larger range. index: %lu, start index: %lu, word span: %lu, " - "new length: %lu, new start: %lu\n", index, startIndex, wordSpan, + "larger range. index: %" B_PRIu32 ", start index: %" B_PRIu32 + ", word span: %" B_PRIu32 ", new length: %" B_PRIu32 + ", new start: %" B_PRIu32 "\n", index, startIndex, wordSpan, newLength, newStart); if (newStart != 0) { uint32 startBits = B_LENDIAN_TO_HOST_INT32(data[startIndex]); - TRACE("BitmapBlock::FindLargestUnmarkedRange(): start bits: %lu\n", - startBits); + TRACE("BitmapBlock::FindLargestUnmarkedRange(): start bits: %" + B_PRIu32 "\n", startBits); for (int32 bit = 31; bit >= 0; --bit) { if ((startBits >> bit & 1) != 0) @@ -477,7 +489,8 @@ BitmapBlock::FindLargestUnmarkedRange(uint32& start, uint32& length) } TRACE("BitmapBlock::FindLargestUnmarkedRange(): updated new start " - "to %lu and new length to %lu\n", newStart, newLength); + "to %" B_PRIu32 " and new length to %" B_PRIu32 "\n", newStart, + newLength); } for (int32 bit = 0; bit < 32; ++bit) { @@ -488,13 +501,14 @@ BitmapBlock::FindLargestUnmarkedRange(uint32& start, uint32& length) } TRACE("BitmapBlock::FindLargestUnmarkedRange(): updated new length to " - "%lu\n", newLength); + "%" B_PRIu32 "\n", newLength); if (newLength > length) { start = newStart; length = newLength; TRACE("BitmapBlock::FindLargestUnmarkedRange(): Found " - "largest length %lu starting at %lu\n", length, start); + "largest length %" B_PRIu32 " starting at %" B_PRIu32 "\n", + length, start); } } } diff --git a/src/add-ons/kernel/file_systems/ext2/BlockAllocator.cpp b/src/add-ons/kernel/file_systems/ext2/BlockAllocator.cpp index 934f4eaa39..bb4f85edfc 100644 --- a/src/add-ons/kernel/file_systems/ext2/BlockAllocator.cpp +++ b/src/add-ons/kernel/file_systems/ext2/BlockAllocator.cpp @@ -136,7 +136,7 @@ AllocationBlockGroup::Initialize(Volume* volume, uint32 blockGroup, fFreeBits = fGroupDescriptor->FreeBlocks(fVolume->Has64bitFeature()); fLargestLength = fFreeBits; fLargestStart = _FirstFreeBlock(); - TRACE("Group %ld is uninit\n", fBlockGroup); + TRACE("Group %" B_PRIu32 " is uninit\n", fBlockGroup); return B_OK; } @@ -146,11 +146,11 @@ AllocationBlockGroup::Initialize(Volume* volume, uint32 blockGroup, if (fGroupDescriptor->FreeBlocks(fVolume->Has64bitFeature()) != fFreeBits) { - ERROR("AllocationBlockGroup(%lu,%lld)::Initialize(): Mismatch between " - "counted free blocks (%lu/%lu) and what is set on the group " - "descriptor (%lu)\n", fBlockGroup, fBitmapBlock, fFreeBits, - fNumBits, fGroupDescriptor->FreeBlocks( - fVolume->Has64bitFeature())); + ERROR("AllocationBlockGroup(%" B_PRIu32 ",%" B_PRIu64 ")::Initialize()" + ": Mismatch between counted free blocks (%" B_PRIu32 "/%" B_PRIu32 + ") and what is set on the group descriptor (%" B_PRIu32 ")\n", + fBlockGroup, fBitmapBlock, fFreeBits, fNumBits, + fGroupDescriptor->FreeBlocks(fVolume->Has64bitFeature())); return B_BAD_DATA; } @@ -166,7 +166,7 @@ AllocationBlockGroup::Initialize(Volume* volume, uint32 blockGroup, status_t AllocationBlockGroup::_ScanFreeRanges() { - TRACE("AllocationBlockGroup::_ScanFreeRanges() for group %ld\n", + TRACE("AllocationBlockGroup::_ScanFreeRanges() for group %" B_PRIu32 "\n", fBlockGroup); BitmapBlock block(fVolume, fNumBits); @@ -206,7 +206,8 @@ AllocationBlockGroup::Allocate(Transaction& transaction, fsblock_t _start, uint32 length) { uint32 start = _start - fStart; - TRACE("AllocationBlockGroup::Allocate(%ld,%ld)\n", start, length); + TRACE("AllocationBlockGroup::Allocate(%" B_PRIu32 ",%" B_PRIu32 ")\n", + start, length); if (length == 0) return B_OK; @@ -222,13 +223,13 @@ AllocationBlockGroup::Allocate(Transaction& transaction, fsblock_t _start, if (!block.SetToWritable(transaction, fBitmapBlock)) return B_ERROR; - TRACE("AllocationBlockGroup::Allocate(): Largest range in %lu-%lu\n", - fLargestStart, fLargestStart + fLargestLength); + TRACE("AllocationBlockGroup::Allocate(): Largest range in %" B_PRIu32 "-%" + B_PRIu32 "\n", fLargestStart, fLargestStart + fLargestLength); ASSERT(block.CheckUnmarked(fLargestStart, fLargestLength)); if (!block.Mark(start, length)) { - ERROR("Failed to allocate blocks from %lu to %lu. Some were " - "already allocated.\n", start, start + length); + ERROR("Failed to allocate blocks from %" B_PRIu32 " to %" B_PRIu32 + ". Some were already allocated.\n", start, start + length); return B_ERROR; } @@ -261,8 +262,8 @@ AllocationBlockGroup::Allocate(Transaction& transaction, fsblock_t _start, return B_OK; } - TRACE("AllocationBlockGroup::Allocate(): Largest range in %lu-%lu\n", - fLargestStart, fLargestStart + fLargestLength); + TRACE("AllocationBlockGroup::Allocate(): Largest range in %" B_PRIu32 "-%" + B_PRIu32 "\n", fLargestStart, fLargestStart + fLargestLength); ASSERT(block.CheckUnmarked(fLargestStart, fLargestLength)); if (fLargestLength < fNumBits / 2) @@ -277,8 +278,8 @@ status_t AllocationBlockGroup::Free(Transaction& transaction, uint32 start, uint32 length) { - TRACE("AllocationBlockGroup::Free(): start: %lu, length %lu\n", start, - length); + TRACE("AllocationBlockGroup::Free(): start: %" B_PRIu32 ", length %" + B_PRIu32 "\n", start, length); if (length == 0) return B_OK; @@ -296,13 +297,13 @@ AllocationBlockGroup::Free(Transaction& transaction, uint32 start, if (!block.SetToWritable(transaction, fBitmapBlock)) return B_ERROR; - TRACE("AllocationBlockGroup::Free(): Largest range in %lu-%lu\n", - fLargestStart, fLargestStart + fLargestLength); + TRACE("AllocationBlockGroup::Free(): Largest range in %" B_PRIu32 "-%" + B_PRIu32 "\n", fLargestStart, fLargestStart + fLargestLength); ASSERT(block.CheckUnmarked(fLargestStart, fLargestLength)); if (!block.Unmark(start, length)) { - ERROR("Failed to free blocks from %lu to %lu. Some were " - "already freed.\n", start, start + length); + ERROR("Failed to free blocks from %" B_PRIu32 " to %" B_PRIu32 + ". Some were already freed.\n", start, start + length); return B_ERROR; } @@ -331,8 +332,8 @@ AllocationBlockGroup::Free(Transaction& transaction, uint32 start, } } - TRACE("AllocationBlockGroup::Free(): Largest range in %lu-%lu\n", - fLargestStart, fLargestStart + fLargestLength); + TRACE("AllocationBlockGroup::Free(): Largest range in %" B_PRIu32 "-%" + B_PRIu32 "\n", fLargestStart, fLargestStart + fLargestLength); ASSERT(block.CheckUnmarked(fLargestStart, fLargestLength)); fFreeBits += length; @@ -445,11 +446,11 @@ AllocationBlockGroup::_InitGroup(Transaction& transaction) if (fGroupDescriptor->FreeBlocks(fVolume->Has64bitFeature()) != fFreeBits) { - ERROR("AllocationBlockGroup(%lu,%lld)::_InitGroup(): Mismatch between " - "counted free blocks (%lu/%lu) and what is set on the group " - "descriptor (%lu)\n", fBlockGroup, fBitmapBlock, fFreeBits, - fNumBits, fGroupDescriptor->FreeBlocks( - fVolume->Has64bitFeature())); + ERROR("AllocationBlockGroup(%" B_PRIu32 ",%" B_PRIu64 ")::_InitGroup()" + ": Mismatch between counted free blocks (%" B_PRIu32 "/%" B_PRIu32 + ") and what is set on the group descriptor (%" B_PRIu32 ")\n", + fBlockGroup, fBitmapBlock, fFreeBits, fNumBits, + fGroupDescriptor->FreeBlocks(fVolume->Has64bitFeature())); return B_BAD_DATA; } @@ -561,9 +562,10 @@ BlockAllocator::Initialize() fFirstBlock = fVolume->FirstDataBlock(); fNumBlocks = fVolume->NumBlocks(); - TRACE("BlockAllocator::Initialize(): blocks per group: %lu, block groups: " - "%lu, first block: %llu, num blocks: %llu\n", fBlocksPerGroup, - fNumGroups, fFirstBlock, fNumBlocks); + TRACE("BlockAllocator::Initialize(): blocks per group: %" B_PRIu32 + ", block groups: %" B_PRIu32 ", first block: %" B_PRIu64 + ", num blocks: %" B_PRIu64 "\n", fBlocksPerGroup, fNumGroups, + fFirstBlock, fNumBlocks); fGroups = new(std::nothrow) AllocationBlockGroup[fNumGroups]; if (fGroups == NULL) @@ -597,9 +599,10 @@ BlockAllocator::AllocateBlocks(Transaction& transaction, uint32 minimum, MutexLocker lock(fLock); TRACE("BlockAllocator::AllocateBlocks(): Acquired lock\n"); - TRACE("BlockAllocator::AllocateBlocks(): transaction: %ld, min: %lu, " - "max: %lu, block group: %lu, start: %llu, num groups: %lu\n", - transaction.ID(), minimum, maximum, blockGroup, start, fNumGroups); + TRACE("BlockAllocator::AllocateBlocks(): transaction: %" B_PRId32 ", min: " + "%" B_PRIu32 ", max: %" B_PRIu32 ", block group: %" B_PRIu32 ", start:" + " %" B_PRIu64 ", num groups: %" B_PRIu32 "\n", transaction.ID(), + minimum, maximum, blockGroup, start, fNumGroups); fsblock_t bestStart = 0; uint32 bestLength = 0; @@ -612,8 +615,9 @@ BlockAllocator::AllocateBlocks(Transaction& transaction, uint32 minimum, for (int32 iterations = 0; iterations < 2; iterations++) { for (; group < last; ++group, ++groupNum) { - TRACE("BlockAllocator::AllocateBlocks(): Group %lu has largest " - "length of %lu\n", groupNum, group->LargestLength()); + TRACE("BlockAllocator::AllocateBlocks(): Group %" B_PRIu32 + " has largest length of %" B_PRIu32 "\n", groupNum, + group->LargestLength()); if (group->LargestLength() > bestLength) { if (start <= group->LargestStart()) { @@ -622,8 +626,9 @@ BlockAllocator::AllocateBlocks(Transaction& transaction, uint32 minimum, bestGroup = groupNum; TRACE("BlockAllocator::AllocateBlocks(): Found a better " - "range: block group: %lu, %llu-%llu\n", groupNum, - bestStart, bestStart + bestLength); + "range: block group: %" B_PRIu32 ", %" B_PRIu64 "-%" + B_PRIu64 "\n", groupNum, bestStart, + bestStart + bestLength); if (bestLength >= maximum) break; @@ -643,22 +648,24 @@ BlockAllocator::AllocateBlocks(Transaction& transaction, uint32 minimum, } if (bestLength < minimum) { - TRACE("BlockAllocator::AllocateBlocks(): best range (length %lu) " - "doesn't have minimum length of %lu\n", bestLength, minimum); + TRACE("BlockAllocator::AllocateBlocks(): best range (length %" B_PRIu32 + ") doesn't have minimum length of %" B_PRIu32 "\n", bestLength, + minimum); return B_DEVICE_FULL; } if (bestLength > maximum) bestLength = maximum; - TRACE("BlockAllocator::AllocateBlocks(): Selected range: block group %lu, " - "%llu-%llu\n", bestGroup, bestStart, bestStart + bestLength); + TRACE("BlockAllocator::AllocateBlocks(): Selected range: block group %" + B_PRIu32 ", %" B_PRIu64 "-%" B_PRIu64 "\n", bestGroup, bestStart, + bestStart + bestLength); status_t status = fGroups[bestGroup].Allocate(transaction, bestStart, bestLength); if (status != B_OK) { - TRACE("BlockAllocator::AllocateBlocks(): Failed to allocate %lu blocks " - "inside block group %lu.\n", bestLength, bestGroup); + TRACE("BlockAllocator::AllocateBlocks(): Failed to allocate %" B_PRIu32 + " blocks inside block group %" B_PRIu32 ".\n", bestLength, bestGroup); return status; } @@ -753,7 +760,8 @@ BlockAllocator::Allocate(Transaction& transaction, Inode* inode, status_t BlockAllocator::Free(Transaction& transaction, fsblock_t start, uint32 length) { - TRACE("BlockAllocator::Free(%llu, %lu)\n", start, length); + TRACE("BlockAllocator::Free(%" B_PRIu64 ", %" B_PRIu32 ")\n", start, + length); MutexLocker lock(fLock); if (start <= fFirstBlock) { @@ -766,16 +774,16 @@ BlockAllocator::Free(Transaction& transaction, fsblock_t start, uint32 length) if (start > fNumBlocks || length > fNumBlocks) return B_BAD_VALUE; - TRACE("BlockAllocator::Free(): first block: %llu, blocks per group: %lu\n", - fFirstBlock, fBlocksPerGroup); + TRACE("BlockAllocator::Free(): first block: %" B_PRIu64 + ", blocks per group: %" B_PRIu32 "\n", fFirstBlock, fBlocksPerGroup); start -= fFirstBlock; off_t end = start + length - 1; uint32 group = start / fBlocksPerGroup; if (group >= fNumGroups) { - panic("BlockAllocator::Free() group %ld too big (fNumGroups %ld)\n", - group, fNumGroups); + panic("BlockAllocator::Free() group %" B_PRIu32 " too big (fNumGroups " + "%" B_PRIu32 ")\n", group, fNumGroups); } uint32 lastGroup = end / fBlocksPerGroup; start = start % fBlocksPerGroup; @@ -783,7 +791,8 @@ BlockAllocator::Free(Transaction& transaction, fsblock_t start, uint32 length) if (group == lastGroup) return fGroups[group].Free(transaction, start, length); - TRACE("BlockAllocator::Free(): Freeing from group %lu: %llu, %llu\n", group, + TRACE("BlockAllocator::Free(): Freeing from group %" B_PRIu32 ": %" + B_PRIu64 ", %" B_PRIu64 "\n", group, start, fGroups[group].NumBits() - start); status_t status = fGroups[group].Free(transaction, start, @@ -792,14 +801,15 @@ BlockAllocator::Free(Transaction& transaction, fsblock_t start, uint32 length) return status; for (++group; group < lastGroup; ++group) { - TRACE("BlockAllocator::Free(): Freeing all from group %lu\n", group); + TRACE("BlockAllocator::Free(): Freeing all from group %" B_PRIu32 "\n", + group); status = fGroups[group].FreeAll(transaction); if (status != B_OK) return status; } - TRACE("BlockAllocator::Free(): Freeing from group %lu: 0-%llu \n", group, - end % fBlocksPerGroup); + TRACE("BlockAllocator::Free(): Freeing from group %" B_PRIu32 ": 0-%" + B_PRIu64 " \n", group, end % fBlocksPerGroup); return fGroups[group].Free(transaction, 0, (end + 1) % fBlocksPerGroup); } @@ -815,7 +825,8 @@ BlockAllocator::_Initialize(BlockAllocator* allocator) uint32 numGroups = allocator->fNumGroups - 1; off_t freeBlocks = 0; - TRACE("BlockAllocator::_Initialize(): free blocks: %llu\n", freeBlocks); + TRACE("BlockAllocator::_Initialize(): free blocks: %" B_PRIdOFF "\n", + freeBlocks); for (uint32 i = 0; i < numGroups; ++i) { status_t status = groups[i].Initialize(volume, i, @@ -826,7 +837,8 @@ BlockAllocator::_Initialize(BlockAllocator* allocator) } freeBlocks += groups[i].FreeBits(); - TRACE("BlockAllocator::_Initialize(): free blocks: %llu\n", freeBlocks); + TRACE("BlockAllocator::_Initialize(): free blocks: %" B_PRIdOFF "\n", + freeBlocks); } // Last block group may have less blocks @@ -840,13 +852,15 @@ BlockAllocator::_Initialize(BlockAllocator* allocator) freeBlocks += groups[numGroups].FreeBits(); - TRACE("BlockAllocator::_Initialize(): free blocks: %llu\n", freeBlocks); + TRACE("BlockAllocator::_Initialize(): free blocks: %" B_PRIdOFF "\n", + freeBlocks); mutex_unlock(&allocator->fLock); if (freeBlocks != volume->NumFreeBlocks()) { - TRACE("Counted free blocks (%llu) doesn't match value in the " - "superblock (%llu).\n", freeBlocks, volume->NumFreeBlocks()); + TRACE("Counted free blocks (%" B_PRIdOFF ") doesn't match value in the" + " superblock (%" B_PRIdOFF ").\n", freeBlocks, + volume->NumFreeBlocks()); return B_BAD_DATA; } diff --git a/src/add-ons/kernel/file_systems/ext2/DataStream.cpp b/src/add-ons/kernel/file_systems/ext2/DataStream.cpp index 6a28b87715..54ed139f56 100644 --- a/src/add-ons/kernel/file_systems/ext2/DataStream.cpp +++ b/src/add-ons/kernel/file_systems/ext2/DataStream.cpp @@ -170,8 +170,8 @@ DataStream::FindBlock(off_t offset, fsblock_t& block, uint32 *_count) return B_ERROR; } - TRACE("inode %Ld: FindBlock(offset %lld): %lld %ld\n", ID(), offset, block, - _count != NULL ? *_count : 1); + TRACE("FindBlock(offset %" B_PRIdOFF "): %" B_PRIu64" %" B_PRIu32 "\n", offset, + block, _count != NULL ? *_count : 1); return B_OK; } @@ -179,8 +179,8 @@ DataStream::FindBlock(off_t offset, fsblock_t& block, uint32 *_count) status_t DataStream::Enlarge(Transaction& transaction, off_t& numBlocks) { - TRACE("DataStream::Enlarge(): current size: %llu, target size: %llu\n", - fNumBlocks, numBlocks); + TRACE("DataStream::Enlarge(): current size: %" B_PRIdOFF ", target size: %" + B_PRIdOFF "\n", fNumBlocks, numBlocks); off_t targetBlocks = numBlocks; fWaiting = _BlocksNeeded(numBlocks); @@ -196,15 +196,15 @@ DataStream::Enlarge(Transaction& transaction, off_t& numBlocks) return status; } - TRACE("DataStream::Enlarge(): current size: %llu, target size: %llu\n", - fNumBlocks, targetBlocks); + TRACE("DataStream::Enlarge(): current size: %" B_PRIdOFF + ", target size: %" B_PRIdOFF "\n", fNumBlocks, targetBlocks); if (fNumBlocks == targetBlocks) return B_OK; } - TRACE("DataStream::Enlarge(): indirect current size: %llu, target size: %llu\n", - fNumBlocks, targetBlocks); + TRACE("DataStream::Enlarge(): indirect current size: %" B_PRIdOFF + ", target size: %" B_PRIdOFF "\n", fNumBlocks, targetBlocks); if (fNumBlocks <= kMaxIndirect) { status = _AddForIndirectBlock(transaction, targetBlocks); @@ -214,15 +214,15 @@ DataStream::Enlarge(Transaction& transaction, off_t& numBlocks) return status; } - TRACE("DataStream::Enlarge(): current size: %llu, target size: %llu\n", - fNumBlocks, targetBlocks); + TRACE("DataStream::Enlarge(): current size: %" B_PRIdOFF + ", target size: %" B_PRIdOFF "\n", fNumBlocks, targetBlocks); if (fNumBlocks == targetBlocks) return B_OK; } - TRACE("DataStream::Enlarge(): indirect2 current size: %llu, target size: %llu\n", - fNumBlocks, targetBlocks); + TRACE("DataStream::Enlarge(): indirect2 current size: %" B_PRIdOFF + ", target size: %" B_PRIdOFF "\n", fNumBlocks, targetBlocks); if (fNumBlocks <= kMaxDoubleIndirect) { status = _AddForDoubleIndirectBlock(transaction, targetBlocks); @@ -232,18 +232,18 @@ DataStream::Enlarge(Transaction& transaction, off_t& numBlocks) return status; } - TRACE("DataStream::Enlarge(): current size: %llu, target size: %llu\n", - fNumBlocks, targetBlocks); + TRACE("DataStream::Enlarge(): current size: %" B_PRIdOFF + ", target size: %" B_PRIdOFF "\n", fNumBlocks, targetBlocks); if (fNumBlocks == targetBlocks) return B_OK; } - TRACE("DataStream::Enlarge(): indirect3 current size: %llu, target size: %llu\n", - fNumBlocks, targetBlocks); + TRACE("DataStream::Enlarge(): indirect3 current size: %" B_PRIdOFF + ", target size: %" B_PRIdOFF "\n", fNumBlocks, targetBlocks); - TRACE("DataStream::Enlarge(): allocated: %lu, waiting: %lu\n", fAllocated, - fWaiting); + TRACE("DataStream::Enlarge(): allocated: %" B_PRIu32 ", waiting: %" + B_PRIu32 "\n", fAllocated, fWaiting); return _AddForTripleIndirectBlock(transaction, targetBlocks); } @@ -252,8 +252,8 @@ DataStream::Enlarge(Transaction& transaction, off_t& numBlocks) status_t DataStream::Shrink(Transaction& transaction, off_t& numBlocks) { - TRACE("DataStream::Shrink(): current size: %llu, target size: %llu\n", - fNumBlocks, numBlocks); + TRACE("DataStream::Shrink(): current size: %" B_PRIdOFF ", target size: %" + B_PRIdOFF "\n", fNumBlocks, numBlocks); fFreeStart = 0; fFreeCount = 0; @@ -329,7 +329,7 @@ DataStream::Shrink(Transaction& transaction, off_t& numBlocks) uint32 DataStream::_BlocksNeeded(off_t numBlocks) { - TRACE("DataStream::BlocksNeeded(): num blocks %llu\n", numBlocks); + TRACE("DataStream::BlocksNeeded(): num blocks %" B_PRIdOFF "\n", numBlocks); off_t blocksNeeded = 0; if (numBlocks > fNumBlocks) { @@ -363,7 +363,7 @@ DataStream::_BlocksNeeded(off_t numBlocks) } } - TRACE("DataStream::BlocksNeeded(): %llu\n", blocksNeeded); + TRACE("DataStream::BlocksNeeded(): %" B_PRIdOFF "\n", blocksNeeded); return blocksNeeded; } @@ -371,8 +371,8 @@ DataStream::_BlocksNeeded(off_t numBlocks) status_t DataStream::_GetBlock(Transaction& transaction, uint32& blockNum) { - TRACE("DataStream::_GetBlock(): allocated: %lu, pos: %llu, waiting: %lu\n", - fAllocated, fAllocatedPos, fWaiting); + TRACE("DataStream::_GetBlock(): allocated: %" B_PRIu32 ", pos: %" B_PRIu64 + ", waiting: %" B_PRIu32 "\n", fAllocated, fAllocatedPos, fWaiting); if (fAllocated == 0) { uint32 blockGroup = (fAllocatedPos - fFirstBlock) @@ -387,8 +387,9 @@ DataStream::_GetBlock(Transaction& transaction, uint32& blockNum) fWaiting -= fAllocated; - TRACE("DataStream::_GetBlock(): newAllocated: %lu, newpos: %llu," - "newwaiting: %lu\n", fAllocated, fAllocatedPos, fWaiting); + TRACE("DataStream::_GetBlock(): newAllocated: %" B_PRIu32 ", newpos: %" + B_PRIu64 ", newwaiting: %" B_PRIu32 "\n", fAllocated, + fAllocatedPos, fWaiting); } fAllocated--; @@ -408,7 +409,8 @@ DataStream::_PrepareBlock(Transaction& transaction, uint32* pos, if (blockNum == 0) { status_t status = _GetBlock(transaction, blockNum); if (status != B_OK) { - ERROR("DataStream::_PrepareBlock() _GetBlock() failed blockNum %ld\n", blockNum); + ERROR("DataStream::_PrepareBlock() _GetBlock() failed blockNum %" + B_PRIu32 "\n", blockNum); return status; } @@ -424,7 +426,7 @@ status_t DataStream::_AddBlocks(Transaction& transaction, uint32* block, off_t _count) { off_t count = _count; - TRACE("DataStream::_AddBlocks(): count: %llu\n", count); + TRACE("DataStream::_AddBlocks(): count: %" B_PRIdOFF "\n", count); while (count > 0) { uint32 blockNum; @@ -446,8 +448,8 @@ status_t DataStream::_AddBlocks(Transaction& transaction, uint32* block, off_t start, off_t end, int recursion) { - TRACE("DataStream::_AddBlocks(): start: %llu, end %llu, recursion: %d\n", - start, end, recursion); + TRACE("DataStream::_AddBlocks(): start: %" B_PRIdOFF ", end %" B_PRIdOFF + ", recursion: %d\n", start, end, recursion); bool clear; uint32 blockNum; @@ -477,8 +479,8 @@ DataStream::_AddBlocks(Transaction& transaction, uint32* block, off_t start, uint32 elementPos = start / elementWidth; uint32 endPos = end / elementWidth; - TRACE("DataStream::_AddBlocks(): element pos: %lu, end pos: %lu\n", - elementPos, endPos); + TRACE("DataStream::_AddBlocks(): element pos: %" B_PRIu32 ", end pos: %" + B_PRIu32 "\n", elementPos, endPos); recursion--; @@ -525,8 +527,8 @@ DataStream::_AddBlocks(Transaction& transaction, uint32* block, off_t start, status_t DataStream::_AddForDirectBlocks(Transaction& transaction, uint32 numBlocks) { - TRACE("DataStream::_AddForDirectBlocks(): current size: %llu, target size: " - "%lu\n", fNumBlocks, numBlocks); + TRACE("DataStream::_AddForDirectBlocks(): current size: %" B_PRIdOFF + ", target size: %" B_PRIu32 "\n", fNumBlocks, numBlocks); uint32* direct = &fStream->direct[fNumBlocks]; uint32 end = numBlocks > kMaxDirect ? kMaxDirect : numBlocks; @@ -537,8 +539,8 @@ DataStream::_AddForDirectBlocks(Transaction& transaction, uint32 numBlocks) status_t DataStream::_AddForIndirectBlock(Transaction& transaction, uint32 numBlocks) { - TRACE("DataStream::_AddForIndirectBlocks(): current size: %llu, target " - "size: %lu\n", fNumBlocks, numBlocks); + TRACE("DataStream::_AddForIndirectBlocks(): current size: %" B_PRIdOFF + ", target size: %" B_PRIu32 "\n", fNumBlocks, numBlocks); uint32 *indirect = &fStream->indirect; uint32 start = fNumBlocks - kMaxDirect; uint32 end = numBlocks - kMaxDirect; @@ -554,8 +556,8 @@ status_t DataStream::_AddForDoubleIndirectBlock(Transaction& transaction, uint32 numBlocks) { - TRACE("DataStream::_AddForDoubleIndirectBlock(): current size: %llu, " - "target size: %lu\n", fNumBlocks, numBlocks); + TRACE("DataStream::_AddForDoubleIndirectBlock(): current size: %" B_PRIdOFF + ", target size: %" B_PRIu32 "\n", fNumBlocks, numBlocks); uint32 *doubleIndirect = &fStream->double_indirect; uint32 start = fNumBlocks - kMaxIndirect; uint32 end = numBlocks - kMaxIndirect; @@ -571,8 +573,8 @@ status_t DataStream::_AddForTripleIndirectBlock(Transaction& transaction, uint32 numBlocks) { - TRACE("DataStream::_AddForTripleIndirectBlock(): current size: %llu, " - "target size: %lu\n", fNumBlocks, numBlocks); + TRACE("DataStream::_AddForTripleIndirectBlock(): current size: %" B_PRIdOFF + ", target size: %" B_PRIu32 "\n", fNumBlocks, numBlocks); uint32 *tripleIndirect = &fStream->triple_indirect; uint32 start = fNumBlocks - kMaxDoubleIndirect; uint32 end = numBlocks - kMaxDoubleIndirect; @@ -584,8 +586,8 @@ DataStream::_AddForTripleIndirectBlock(Transaction& transaction, status_t DataStream::_PerformFree(Transaction& transaction) { - TRACE("DataStream::_PerformFree(): start: %lu, count: %lu\n", fFreeStart, - fFreeCount); + TRACE("DataStream::_PerformFree(): start: %" B_PRIu32 ", count: %" B_PRIu32 + "\n", fFreeStart, fFreeCount); status_t status; if (fFreeCount == 0) @@ -604,9 +606,9 @@ status_t DataStream::_MarkBlockForRemoval(Transaction& transaction, uint32* block) { - TRACE("DataStream::_MarkBlockForRemoval(*(%p) = %lu): free start: %lu, " - "free count: %lu\n", block, B_LENDIAN_TO_HOST_INT32(*block), - fFreeStart, fFreeCount); + TRACE("DataStream::_MarkBlockForRemoval(*(%p) = %" B_PRIu32 + "): free start: %" B_PRIu32 ", free count: %" B_PRIu32 "\n", block, + B_LENDIAN_TO_HOST_INT32(*block), fFreeStart, fFreeCount); uint32 blockNum = B_LENDIAN_TO_HOST_INT32(*block); *block = 0; @@ -632,7 +634,7 @@ status_t DataStream::_FreeBlocks(Transaction& transaction, uint32* block, uint32 _count) { uint32 count = _count; - TRACE("DataStream::_FreeBlocks(%p, %lu)\n", block, count); + TRACE("DataStream::_FreeBlocks(%p, %" B_PRIu32 ")\n", block, count); while (count > 0) { status_t status = _MarkBlockForRemoval(transaction, block); @@ -654,8 +656,8 @@ DataStream::_FreeBlocks(Transaction& transaction, uint32* block, off_t start, off_t end, bool freeParent, int recursion) { // TODO: Designed specifically for shrinking. Perhaps make it more general? - TRACE("DataStream::_FreeBlocks(%p, %llu, %llu, %c, %d)\n", - block, start, end, freeParent ? 't' : 'f', recursion); + TRACE("DataStream::_FreeBlocks(%p, %" B_PRIdOFF ", %" B_PRIdOFF + ", %c, %d)\n", block, start, end, freeParent ? 't' : 'f', recursion); uint32 blockNum = B_LENDIAN_TO_HOST_INT32(*block); @@ -726,8 +728,8 @@ DataStream::_FreeBlocks(Transaction& transaction, uint32* block, off_t start, status_t DataStream::_RemoveFromDirectBlocks(Transaction& transaction, uint32 numBlocks) { - TRACE("DataStream::_RemoveFromDirectBlocks(): current size: %llu, " - "target size: %lu\n", fNumBlocks, numBlocks); + TRACE("DataStream::_RemoveFromDirectBlocks(): current size: %" B_PRIdOFF + ", target size: %" B_PRIu32 "\n", fNumBlocks, numBlocks); uint32* direct = &fStream->direct[numBlocks]; off_t end = fNumBlocks > kMaxDirect ? kMaxDirect : fNumBlocks; @@ -738,8 +740,8 @@ DataStream::_RemoveFromDirectBlocks(Transaction& transaction, uint32 numBlocks) status_t DataStream::_RemoveFromIndirectBlock(Transaction& transaction, uint32 numBlocks) { - TRACE("DataStream::_RemoveFromIndirectBlock(): current size: %llu, " - "target size: %lu\n", fNumBlocks, numBlocks); + TRACE("DataStream::_RemoveFromIndirectBlock(): current size: %" B_PRIdOFF + ", target size: %" B_PRIu32 "\n", fNumBlocks, numBlocks); uint32* indirect = &fStream->indirect; off_t start = numBlocks <= kMaxDirect ? 0 : numBlocks - kMaxDirect; off_t end = fNumBlocks - kMaxDirect; @@ -757,8 +759,8 @@ status_t DataStream::_RemoveFromDoubleIndirectBlock(Transaction& transaction, uint32 numBlocks) { - TRACE("DataStream::_RemoveFromDoubleIndirectBlock(): current size: %llu, " - "target size: %lu\n", fNumBlocks, numBlocks); + TRACE("DataStream::_RemoveFromDoubleIndirectBlock(): current size: %" B_PRIdOFF + ", target size: %" B_PRIu32 "\n", fNumBlocks, numBlocks); uint32* doubleIndirect = &fStream->double_indirect; off_t start = numBlocks <= kMaxIndirect ? 0 : numBlocks - kMaxIndirect; off_t end = fNumBlocks - kMaxIndirect; @@ -776,8 +778,8 @@ status_t DataStream::_RemoveFromTripleIndirectBlock(Transaction& transaction, uint32 numBlocks) { - TRACE("DataStream::_RemoveFromTripleIndirectBlock(): current size: %llu, " - "target size: %lu\n", fNumBlocks, numBlocks); + TRACE("DataStream::_RemoveFromTripleIndirectBlock(): current size: %" B_PRIdOFF + ", target size: %" B_PRIu32 "\n", fNumBlocks, numBlocks); uint32* tripleIndirect = &fStream->triple_indirect; off_t start = numBlocks <= kMaxDoubleIndirect ? 0 : numBlocks - kMaxDoubleIndirect; diff --git a/src/add-ons/kernel/file_systems/ext2/DirectoryIterator.cpp b/src/add-ons/kernel/file_systems/ext2/DirectoryIterator.cpp index 4082367928..a1e4eb312e 100644 --- a/src/add-ons/kernel/file_systems/ext2/DirectoryIterator.cpp +++ b/src/add-ons/kernel/file_systems/ext2/DirectoryIterator.cpp @@ -56,8 +56,8 @@ DirectoryIterator::DirectoryIterator(Inode* directory, off_t start, fStartLogicalBlock(fLogicalBlock), fStartDisplacement(fDisplacement) { - TRACE("DirectoryIterator::DirectoryIterator() %lld: num blocks: %lu\n", - fDirectory->ID(), fNumBlocks); + TRACE("DirectoryIterator::DirectoryIterator() %" B_PRIdINO ": num blocks: " + "%" B_PRIu32 "\n", fDirectory->ID(), fNumBlocks); fIndexing = parent != NULL; fInitStatus = fDirectory->FindBlock(start, fPhysicalBlock); fStartPhysicalBlock = fPhysicalBlock; @@ -83,7 +83,7 @@ DirectoryIterator::InitCheck() status_t DirectoryIterator::Get(char* name, size_t* _nameLength, ino_t* _id) { - TRACE("DirectoryIterator::Get() ID %lld\n", fDirectory->ID()); + TRACE("DirectoryIterator::Get() ID %" B_PRIdINO "\n", fDirectory->ID()); if (_Offset() >= fDirectory->Size()) { TRACE("DirectoryIterator::Get() out of entries\n"); return B_ENTRY_NOT_FOUND; @@ -94,7 +94,8 @@ DirectoryIterator::Get(char* name, size_t* _nameLength, ino_t* _id) if (block == NULL) return B_IO_ERROR; - TRACE("DirectoryIterator::Get(): Displacement: %lu\n", fDisplacement); + TRACE("DirectoryIterator::Get(): Displacement: %" B_PRIu32 "\n", + fDisplacement); const ext2_dir_entry* entry = (const ext2_dir_entry*)&block[fDisplacement]; if (entry->Length() == 0 || entry->InodeID() == 0) @@ -103,9 +104,10 @@ DirectoryIterator::Get(char* name, size_t* _nameLength, ino_t* _id) if (entry->NameLength() != 0) { size_t length = entry->NameLength(); - TRACE("block %lu, displacement %lu: entry ino %lu, length %u, " - "name length %lu, type %u\n", fLogicalBlock, fDisplacement, - entry->InodeID(), entry->Length(), length, entry->FileType()); + TRACE("block %" B_PRIu32 ", displacement %" B_PRIu32 ": entry ino %" + B_PRIu32 ", length %u, name length %" B_PRIuSIZE ", type %u\n", + fLogicalBlock, fDisplacement, entry->InodeID(), entry->Length(), + length, entry->FileType()); if (*_nameLength > 0) { if (length + 1 > *_nameLength) @@ -141,7 +143,8 @@ DirectoryIterator::GetNext(char* name, size_t* _nameLength, ino_t* _id) status_t DirectoryIterator::Next() { - TRACE("DirectoryIterator::Next() fDirectory->ID() %lld\n", fDirectory->ID()); + TRACE("DirectoryIterator::Next() fDirectory->ID() %" B_PRIdINO "\n", + fDirectory->ID()); if (_Offset() >= fDirectory->Size()) { TRACE("DirectoryIterator::Next() out of entries\n"); @@ -161,8 +164,9 @@ DirectoryIterator::Next() entry = (ext2_dir_entry*)(block + fDisplacement); do { - TRACE("Checking entry at block %llu, displacement %lu entry inodeid %ld\n", fPhysicalBlock, - fDisplacement, entry->InodeID()); + TRACE("Checking entry at block %" B_PRIu64 ", displacement %" B_PRIu32 + " entry inodeid %" B_PRIu32 "\n", fPhysicalBlock, fDisplacement, + entry->InodeID()); if (entry->Length() != 0) { if (!entry->IsValid()) { @@ -183,7 +187,7 @@ DirectoryIterator::Next() if (status != B_OK) return status; - if (_Offset() + ext2_dir_entry::MinimumSize() + if ((off_t)(_Offset() + ext2_dir_entry::MinimumSize()) >= fDirectory->Size()) { TRACE("DirectoryIterator::Next() end of directory file\n"); return B_ENTRY_NOT_FOUND; @@ -203,7 +207,8 @@ DirectoryIterator::Next() entry = (ext2_dir_entry*)(block + fDisplacement); - TRACE("DirectoryIterator::Next() skipping entry %d %ld\n", entry->Length(), entry->InodeID()); + TRACE("DirectoryIterator::Next() skipping entry %d %" B_PRIu32 "\n", + entry->Length(), entry->InodeID()); } while (entry->Length() == 0 || entry->InodeID() == 0); TRACE("DirectoryIterator::Next() entry->Length() %d entry->name %*s\n", @@ -228,7 +233,8 @@ void DirectoryIterator::Restart() { TRACE("DirectoryIterator::Restart(): (logical, physical, displacement): " - "current: (%lu, %llu, %lu), start: (%lu, %llu, %lu)\n", fLogicalBlock, + "current: (%" B_PRIu32 ", %" B_PRIu64 ", %" B_PRIu32 "), start: (%" + B_PRIu32 ", %" B_PRIu64 ", %" B_PRIu32 ")\n", fLogicalBlock, fPhysicalBlock, fDisplacement, fStartLogicalBlock, fStartPhysicalBlock, fStartDisplacement); fLogicalBlock = fStartLogicalBlock; @@ -365,7 +371,8 @@ DirectoryIterator::RemoveEntry(Transaction& transaction) return B_OK; } - TRACE("DirectoryIterator::RemoveEntry() fDisplacement %ld\n", fDisplacement); + TRACE("DirectoryIterator::RemoveEntry() fDisplacement %" B_PRIu32 "\n", + fDisplacement); if (fPreviousDisplacement == fDisplacement) { char buffer[EXT2_NAME_LENGTH + 1]; @@ -471,8 +478,9 @@ DirectoryIterator::_AddEntry(Transaction& transaction, const char* name, uint8 nameLength, ino_t id, uint8 type, uint16 newLength, uint16 pos, bool hasPrevious) { - TRACE("DirectoryIterator::_AddEntry(%s, %d, %llu, %d, %d, %d, %c)\n", - name, nameLength, id, type, newLength, pos, hasPrevious ? 't' : 'f'); + TRACE("DirectoryIterator::_AddEntry(%s, %d, %" B_PRIdINO ", %d, %d, %d, " + "%c)\n", name, nameLength, id, type, newLength, pos, + hasPrevious ? 't' : 'f'); CachedBlock cached(fVolume); uint8* block = cached.SetToWritable(transaction, fPhysicalBlock); @@ -507,8 +515,8 @@ DirectoryIterator::_SplitIndexedBlock(Transaction& transaction, uint32 newBlocksPos, bool firstSplit) { // Block is full, split required - TRACE("DirectoryIterator::_SplitIndexedBlock(.., %s, %u, %llu, %lu, %c)\n", - name, nameLength, id, newBlocksPos, + TRACE("DirectoryIterator::_SplitIndexedBlock(.., %s, %u, %" B_PRIdINO ", %" + B_PRIu32 ", %c)\n", name, nameLength, id, newBlocksPos, firstSplit ? 't' : 'f'); // Allocate a buffer for the entries in the block @@ -598,14 +606,14 @@ DirectoryIterator::_SplitIndexedBlock(Transaction& transaction, TRACE("DirectoryIterator::_SplitIndexedBlock(): pos: %p, name " "length: %u, entry length: %u\n", entry.position, - (unsigned int)dirEntry->name_length, - (unsigned int)dirEntry->Length()); + dirEntry->name_length, + dirEntry->Length()); char cbuffer[256]; memcpy(cbuffer, dirEntry->name, dirEntry->name_length); cbuffer[dirEntry->name_length] = '\0'; entry.hash = htree.Hash(dirEntry->name, dirEntry->name_length); - TRACE("DirectoryIterator::_SplitIndexedBlock(): %s -> %lu\n", + TRACE("DirectoryIterator::_SplitIndexedBlock(): %s -> %" B_PRIu32 "\n", cbuffer, entry.hash); status = entrySet.Insert(entry); @@ -630,7 +638,7 @@ DirectoryIterator::_SplitIndexedBlock(Transaction& transaction, entry.position = (uint8*)&newEntry; entry.hash = htree.Hash(name, nameLength); - TRACE("DirectoryIterator::_SplitIndexedBlock(): %s -> %lu\n", + TRACE("DirectoryIterator::_SplitIndexedBlock(): %s -> %" B_PRIu32 "\n", name, entry.hash); entrySet.Insert(entry); @@ -639,8 +647,8 @@ DirectoryIterator::_SplitIndexedBlock(Transaction& transaction, VectorSet::Iterator iterator = entrySet.Begin(); int32 median = entrySet.Count() / 2; displacement = 0; - TRACE("DirectoryIterator::_SplitIndexedBlock(): Count: %ld, median: %ld\n", - entrySet.Count(), median); + TRACE("DirectoryIterator::_SplitIndexedBlock(): Count: %" B_PRId32 + ", median: %" B_PRId32 "\n", entrySet.Count(), median); uint32 previousHash = (*iterator).hash; diff --git a/src/add-ons/kernel/file_systems/ext2/ExtentStream.cpp b/src/add-ons/kernel/file_systems/ext2/ExtentStream.cpp index 491ff15f07..6bf7ff62f9 100644 --- a/src/add-ons/kernel/file_systems/ext2/ExtentStream.cpp +++ b/src/add-ons/kernel/file_systems/ext2/ExtentStream.cpp @@ -49,7 +49,7 @@ status_t ExtentStream::FindBlock(off_t offset, fsblock_t& block, uint32 *_count) { fileblock_t index = offset >> fVolume->BlockShift(); - TRACE("FindBlock(%lld, %lld)\n", offset, index); + TRACE("FindBlock(%" B_PRIdOFF ", %" B_PRIu64 ")\n", offset, index); if (offset >= fSize) { TRACE("FindBlock: offset larger than inode size\n"); @@ -69,8 +69,8 @@ ExtentStream::FindBlock(off_t offset, fsblock_t& block, uint32 *_count) && stream->extent_index[i].LogicalBlock() <= index) { i++; } - TRACE("FindBlock() getting index %ld at %lld\n", i - 1, - stream->extent_index[i - 1].PhysicalBlock()); + TRACE("FindBlock() getting index %" B_PRId32 " at %" B_PRIu64 "\n", + i - 1, stream->extent_index[i - 1].PhysicalBlock()); stream = (ext2_extent_stream *)cached.SetTo( stream->extent_index[i - 1].PhysicalBlock()); if (!stream->extent_header.IsValid()) @@ -97,8 +97,8 @@ ExtentStream::FindBlock(off_t offset, fsblock_t& block, uint32 *_count) - stream->extent_entries[middle].LogicalBlock(); if (diff > stream->extent_entries[middle].Length()) { // sparse block - TRACE("FindBlock() sparse block index %lld at %ld\n", index, - stream->extent_entries[middle].LogicalBlock()); + TRACE("FindBlock() sparse block index %" B_PRIu64 " at %" B_PRIu32 + "\n", index, stream->extent_entries[middle].LogicalBlock()); block = 0xffffffff; return B_OK; } @@ -106,16 +106,16 @@ ExtentStream::FindBlock(off_t offset, fsblock_t& block, uint32 *_count) block = stream->extent_entries[middle].PhysicalBlock() + diff; if (_count) *_count = stream->extent_entries[middle].Length() - diff; - TRACE("FindBlock(offset %lld): %lld %ld\n", offset, - block, _count != NULL ? *_count : 1); + TRACE("FindBlock(offset %" B_PRIdOFF "): %" B_PRIu64 " %" B_PRIu32 + "\n", offset, block, _count != NULL ? *_count : 1); return B_OK; } for (int32 i = 0; i < stream->extent_header.NumEntries(); i++) { if (stream->extent_entries[i].LogicalBlock() > index) { // sparse block - TRACE("FindBlock() sparse block index %lld at %ld\n", index, - stream->extent_entries[i].LogicalBlock()); + TRACE("FindBlock() sparse block index %" B_PRIu64 " at %" B_PRIu32 + "\n", index, stream->extent_entries[i].LogicalBlock()); block = 0xffffffff; return B_OK; } @@ -124,8 +124,8 @@ ExtentStream::FindBlock(off_t offset, fsblock_t& block, uint32 *_count) block = stream->extent_entries[i].PhysicalBlock() + diff; if (_count) *_count = stream->extent_entries[i].Length() - diff; - TRACE("FindBlock(offset %lld): %lld %ld\n", offset, - block, _count != NULL ? *_count : 1); + TRACE("FindBlock(offset %" B_PRIdOFF "): %" B_PRIu64 " %" B_PRIu32 + "\n", offset, block, _count != NULL ? *_count : 1); return B_OK; } } @@ -137,8 +137,8 @@ ExtentStream::FindBlock(off_t offset, fsblock_t& block, uint32 *_count) status_t ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) { - TRACE("Enlarge(): current size: %llu, target size: %llu\n", - fNumBlocks, numBlocks); + TRACE("Enlarge(): current size: %" B_PRIdOFF ", target size: %" B_PRIdOFF + "\n", fNumBlocks, numBlocks); off_t targetBlocks = numBlocks; numBlocks = targetBlocks - fNumBlocks; @@ -172,8 +172,8 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) panic("stream->extent_header.NumEntries() == 0\n"); int32 lastIndex = stream->extent_header.NumEntries() - 1; TRACE("Enlarge() depth %d\n", stream->extent_header.Depth()); - TRACE("Enlarge() getting index %ld at %lld\n", lastIndex, - stream->extent_index[lastIndex].PhysicalBlock()); + TRACE("Enlarge() getting index %" B_PRId32 " at %" B_PRIu64 "\n", + lastIndex, stream->extent_index[lastIndex].PhysicalBlock()); path[++level] = stream->extent_index[lastIndex].PhysicalBlock(); stream = (ext2_extent_stream *)cached.SetTo(path[level]); if (stream == NULL) @@ -184,7 +184,7 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) if (stream->extent_header.NumEntries() > 0) { ext2_extent_entry &last = stream->extent_entries[ stream->extent_header.NumEntries() - 1]; - TRACE("Enlarge() last %lld allocatedPos %lld\n", + TRACE("Enlarge() last %" B_PRIu64 " allocatedPos %" B_PRIu64 "\n", last.PhysicalBlock() + last.Length(), fAllocatedPos); if (last.PhysicalBlock() + last.Length() == fAllocatedPos && (last.Length() + allocated) <= EXT2_EXTENT_MAX_LENGTH) { @@ -205,8 +205,8 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) if (stream->extent_header.NumEntries() >= stream->extent_header.MaxEntries()) { - TRACE("Enlarge() adding leaf and indexes at depth %d level %ld\n", - stream->extent_header.Depth(), level); + TRACE("Enlarge() adding leaf and indexes at depth %d level %" + B_PRId32 "\n", stream->extent_header.Depth(), level); // try to add a leaf and indexes while (--level >= 0) { stream = (ext2_extent_stream *)cached.SetTo(path[level]); @@ -216,7 +216,7 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) < stream->extent_header.MaxEntries()) { break; } - TRACE("Enlarge() going up from level %ld\n", level); + TRACE("Enlarge() going up from level %" B_PRId32 "\n", level); } if (level < 0 && fStream->extent_header.NumEntries() @@ -231,7 +231,8 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) return status; } ASSERT(_CheckBlock(fStream, newBlock) == B_OK); - TRACE("Enlarge() move root to block %lld\n", newBlock); + TRACE("Enlarge() move root to block %" B_PRIu64 "\n", + newBlock); numBlocks++; stream = (ext2_extent_stream *)cached.SetToWritable( transaction, newBlock); @@ -277,7 +278,7 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) path[level++] = newBlock; depth = stream->extent_header.Depth() - 1; - TRACE("Enlarge() init index block %lld at depth %d\n", + TRACE("Enlarge() init index block %" B_PRIu64 " at depth %d\n", newBlock, depth); stream = (ext2_extent_stream *)cached.SetToWritable( transaction, newBlock); @@ -293,12 +294,12 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) ASSERT(Check()); } - TRACE("Enlarge() depth %d level %ld\n", + TRACE("Enlarge() depth %d level %" B_PRId32 "\n", stream->extent_header.Depth(), level); if (stream->extent_header.Depth() == 1) { - TRACE("Enlarge() adding an entry block at depth %d level %ld\n", - depth, level); + TRACE("Enlarge() adding an entry block at depth %d level %" + B_PRId32 "\n", depth, level); fsblock_t newBlock; if (level >= 0) newBlock = path[level]; @@ -319,8 +320,8 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) stream->extent_index[index].SetPhysicalBlock(newBlock); stream->extent_header.SetNumEntries(index + 1); - TRACE("Enlarge() init entry block %lld at depth %d\n", - newBlock, depth); + TRACE("Enlarge() init entry block %" B_PRIu64 + " at depth %d\n", newBlock, depth); stream = (ext2_extent_stream *)cached.SetToWritable( transaction, newBlock); if (stream == NULL) @@ -336,7 +337,7 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) } // add a new entry - TRACE("Enlarge() add entry %lld\n", fAllocatedPos); + TRACE("Enlarge() add entry %" B_PRIu64 "\n", fAllocatedPos); if (stream != fStream) { stream = (ext2_extent_stream *)cached.SetToWritable( transaction, cached.BlockNumber()); @@ -348,7 +349,7 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) stream->extent_entries[index].SetLength(allocated); stream->extent_entries[index].SetPhysicalBlock(fAllocatedPos); stream->extent_header.SetNumEntries(index + 1); - TRACE("Enlarge() entry added at index %ld\n", index); + TRACE("Enlarge() entry added at index %" B_PRId32 "\n", index); ASSERT(stream->extent_header.IsValid()); fNumBlocks += allocated; @@ -362,8 +363,8 @@ ExtentStream::Enlarge(Transaction& transaction, off_t& numBlocks) status_t ExtentStream::Shrink(Transaction& transaction, off_t& numBlocks) { - TRACE("DataStream::Shrink(): current size: %llu, target size: %llu\n", - fNumBlocks, numBlocks); + TRACE("DataStream::Shrink(): current size: %" B_PRIdOFF ", target size: %" + B_PRIdOFF "\n", fNumBlocks, numBlocks); off_t targetBlocks = numBlocks; numBlocks = fNumBlocks - targetBlocks; @@ -380,8 +381,8 @@ ExtentStream::Shrink(Transaction& transaction, off_t& numBlocks) panic("stream->extent_header.NumEntries() == 0\n"); int32 lastIndex = stream->extent_header.NumEntries() - 1; TRACE("Shrink() depth %d\n", stream->extent_header.Depth()); - TRACE("Shrink() getting index %ld at %lld\n", lastIndex, - stream->extent_index[lastIndex].PhysicalBlock()); + TRACE("Shrink() getting index %" B_PRId32 " at %" B_PRIu64 "\n", + lastIndex, stream->extent_index[lastIndex].PhysicalBlock()); path[++level] = stream->extent_index[lastIndex].PhysicalBlock(); stream = (ext2_extent_stream *)cached.SetToWritable(transaction, path[level]); @@ -401,19 +402,20 @@ ExtentStream::Shrink(Transaction& transaction, off_t& numBlocks) } uint16 length = min_c(last.Length(), fNumBlocks - targetBlocks); fsblock_t block = last.PhysicalBlock() + last.Length() - length; - TRACE("Shrink() free block %lld length %d\n", block, length); + TRACE("Shrink() free block %" B_PRIu64 " length %d\n", block, + length); status = fVolume->FreeBlocks(transaction, block, length); if (status != B_OK) break; fNumBlocks -= length; stream->extent_entries[index].SetLength(last.Length() - length); - TRACE("Shrink() new length for %ld: %d\n", index, last.Length()); + TRACE("Shrink() new length for %" B_PRId32 ": %d\n", index, last.Length()); if (last.Length() != 0) break; index--; - TRACE("Shrink() next index: %ld\n", index); + TRACE("Shrink() next index: %" B_PRId32 "\n", index); } - TRACE("Shrink() new entry count: %ld\n", index + 1); + TRACE("Shrink() new entry count: %" B_PRId32 "\n", index + 1); stream->extent_header.SetNumEntries(index + 1); ASSERT(Check()); @@ -476,8 +478,8 @@ ExtentStream::_Check(ext2_extent_stream *stream, fileblock_t &block) for (int32 i = 0; i < stream->extent_header.NumEntries(); i++) { ext2_extent_entry &entry = stream->extent_entries[i]; if (entry.LogicalBlock() < block) { - panic("_Check() entry %ld %lld %ld\n", i, block, - entry.LogicalBlock()); + panic("_Check() entry %" B_PRId32 " %" B_PRIu64 " %" B_PRIu32 + "\n", i, block, entry.LogicalBlock()); return B_BAD_VALUE; } block = entry.LogicalBlock() + entry.Length(); @@ -489,8 +491,8 @@ ExtentStream::_Check(ext2_extent_stream *stream, fileblock_t &block) for (int32 i = 0; i < stream->extent_header.NumEntries(); i++) { ext2_extent_index &index = stream->extent_index[i]; if (index.LogicalBlock() < block) { - panic("_Check() index %ld %lld %ld\n", i, block, - index.LogicalBlock()); + panic("_Check() index %" B_PRId32 " %" B_PRIu64 " %" B_PRIu32 + "\n", i, block, index.LogicalBlock()); return B_BAD_VALUE; } ext2_extent_stream *child = (ext2_extent_stream *)cached.SetTo( @@ -519,8 +521,9 @@ ExtentStream::_CheckBlock(ext2_extent_stream *stream, fsblock_t block) ext2_extent_entry &entry = stream->extent_entries[i]; if (entry.PhysicalBlock() <= block && (entry.PhysicalBlock() + entry.Length()) > block) { - panic("_CheckBlock() entry %ld %lld %lld %d\n", i, block, - entry.PhysicalBlock(), entry.Length()); + panic("_CheckBlock() entry %" B_PRId32 " %" B_PRIu64 " %" + B_PRIu64 " %d\n", i, block, entry.PhysicalBlock(), + entry.Length()); return B_BAD_VALUE; } } @@ -531,7 +534,7 @@ ExtentStream::_CheckBlock(ext2_extent_stream *stream, fsblock_t block) for (int32 i = 0; i < stream->extent_header.NumEntries(); i++) { ext2_extent_index &index = stream->extent_index[i]; if (index.PhysicalBlock() == block) { - panic("_CheckBlock() index %ld %lld\n", i, block); + panic("_CheckBlock() index %" B_PRId32 " %" B_PRIu64 "\n", i, block); return B_BAD_VALUE; } ext2_extent_stream *child = (ext2_extent_stream *)cached.SetTo( diff --git a/src/add-ons/kernel/file_systems/ext2/HTree.cpp b/src/add-ons/kernel/file_systems/ext2/HTree.cpp index ad13fffc5f..07acc7e7fe 100644 --- a/src/add-ons/kernel/file_systems/ext2/HTree.cpp +++ b/src/add-ons/kernel/file_systems/ext2/HTree.cpp @@ -62,8 +62,8 @@ HTree::HTree(Volume* volume, Inode* directory) fHashSeed[2] = superBlock.HashSeed(2); fHashSeed[3] = superBlock.HashSeed(3); - TRACE("HTree::HTree() %lx %lx %lx %lx\n", fHashSeed[0], - fHashSeed[1], fHashSeed[2], fHashSeed[3]); + TRACE("HTree::HTree() %" B_PRIx32 " %" B_PRIx32 " %" B_PRIx32 " %" B_PRIx32 + "\n", fHashSeed[0], fHashSeed[1], fHashSeed[2], fHashSeed[3]); if (fHashSeed[0] == 0 && fHashSeed[1] == 0 && fHashSeed[2] == 0 && fHashSeed[3] == 0) { @@ -179,7 +179,7 @@ HTree::Hash(const char* name, uint8 length) hash = 0; #endif - TRACE("HTree::_Hash(): filename hash 0x%lX\n", hash); + TRACE("HTree::_Hash(): filename hash 0x%" B_PRIx32 "\n", hash); return hash & ~1; } @@ -366,7 +366,8 @@ HTree::_HashTEA(const char* name, uint8 _length) uint32 blocks[4]; _PrepareBlocksForHash(name, (uint32)length, blocks, 4); - TRACE("_HashTEA %lx %lx %lx\n", blocks[0], blocks[1], blocks[2]); + TRACE("_HashTEA %" B_PRIx32 " %" B_PRIx32 " %" B_PRIx32 "\n", + blocks[0], blocks[1], blocks[2]); _TEATransform(buffer, blocks); name += 16; diff --git a/src/add-ons/kernel/file_systems/ext2/HTreeEntryIterator.cpp b/src/add-ons/kernel/file_systems/ext2/HTreeEntryIterator.cpp index 09299f9246..8f4bf2d0a6 100644 --- a/src/add-ons/kernel/file_systems/ext2/HTreeEntryIterator.cpp +++ b/src/add-ons/kernel/file_systems/ext2/HTreeEntryIterator.cpp @@ -41,8 +41,8 @@ HTreeEntryIterator::HTreeEntryIterator(off_t offset, Inode* directory) fCurrentEntry = fFirstEntry; } - TRACE("HTreeEntryIterator::HTreeEntryIterator(): created %p, block %llu, " - "entry no. %lu, parent: %p\n", this, fBlockNum, (uint32)fCurrentEntry, + TRACE("HTreeEntryIterator::HTreeEntryIterator(): created %p, block %" B_PRIu64 ", " + "entry no. %u, parent: %p\n", this, fBlockNum, fCurrentEntry, fParent); } @@ -63,16 +63,16 @@ HTreeEntryIterator::HTreeEntryIterator(uint32 block, uint32 blockSize, // fCurrentEntry is initialized to 1 to skip the fake directory entry fInitStatus = B_OK; - TRACE("HTreeEntryIterator::HTreeEntryIterator(): created %p, block %lu, " - "parent: %p\n", this, block, fParent); + TRACE("HTreeEntryIterator::HTreeEntryIterator(): created %p, block %" + B_PRIu32 ", parent: %p\n", this, block, fParent); } status_t HTreeEntryIterator::Init() { - TRACE("HTreeEntryIterator::Init() first entry: %lu\n", - (uint32)fFirstEntry); + TRACE("HTreeEntryIterator::Init() first entry: %u\n", + fFirstEntry); if (fInitStatus != B_OK) return fInitStatus; @@ -99,15 +99,15 @@ HTreeEntryIterator::Init() } if (fLimit != fBlockSize / sizeof(HTreeEntry) - fFirstEntry) { - ERROR("HTreeEntryIterator::Init() bad fLimit %lu should be %lu " - "at block %llu\n", (uint32)fLimit, fBlockSize / sizeof(HTreeEntry) - - fFirstEntry, fBlockNum); + ERROR("HTreeEntryIterator::Init() bad fLimit %u should be %" B_PRIu32 + " at block %" B_PRIu64 "\n", fLimit, + (uint32)(fBlockSize / sizeof(HTreeEntry) - fFirstEntry), fBlockNum); fCount = fLimit = 0; return B_ERROR; } - TRACE("HTreeEntryIterator::Init() count %lu limit %lu\n", - (uint32)fCount, (uint32)fLimit); + TRACE("HTreeEntryIterator::Init() count %u limit %u\n", + fCount, fLimit); return B_OK; } @@ -149,8 +149,8 @@ HTreeEntryIterator::Lookup(uint32 hash, int indirections, HTreeEntry* end = (HTreeEntry*)block + fCount + fFirstEntry - 1; HTreeEntry* middle = start; - TRACE("HTreeEntryIterator::Lookup() current entry: %lu\n", - (uint32)fCurrentEntry); + TRACE("HTreeEntryIterator::Lookup() current entry: %u\n", + fCurrentEntry); TRACE("HTreeEntryIterator::Lookup() indirections: %d s:%p m:%p e:%p\n", indirections, start, middle, end); @@ -161,7 +161,8 @@ HTreeEntryIterator::Lookup(uint32 hash, int indirections, TRACE("HTreeEntryIterator::Lookup() indirections: %d s:%p m:%p e:%p\n", indirections, start, middle, end); - TRACE("HTreeEntryIterator::Lookup() %lx %lx\n", hash, middle->Hash()); + TRACE("HTreeEntryIterator::Lookup() %" B_PRIx32 " %" B_PRIx32 "\n", + hash, middle->Hash()); if (hash >= middle->Hash()) start = middle + 1; @@ -175,8 +176,8 @@ HTreeEntryIterator::Lookup(uint32 hash, int indirections, if (indirections == 0) { TRACE("HTreeEntryIterator::Lookup(): Creating an indexed directory " - "iterator starting at block: %lu, hash: 0x%lX\n", start->Block(), - start->Hash()); + "iterator starting at block: %" B_PRIu32 ", hash: 0x%" B_PRIx32 + "\n", start->Block(), start->Hash()); *directoryIterator = new(std::nothrow) DirectoryIterator(fDirectory, start->Block() * fBlockSize, this); @@ -188,7 +189,8 @@ HTreeEntryIterator::Lookup(uint32 hash, int indirections, } TRACE("HTreeEntryIterator::Lookup(): Creating a HTree entry iterator " - "starting at block: %lu, hash: 0x%lX\n", start->Block(), start->Hash()); + "starting at block: %" B_PRIu32 ", hash: 0x%" B_PRIx32 "\n", + start->Block(), start->Hash()); fsblock_t blockNum; status_t status = fDirectory->FindBlock(start->Block() * fBlockSize, blockNum); @@ -215,8 +217,8 @@ status_t HTreeEntryIterator::GetNext(uint32& childBlock) { fCurrentEntry++; - TRACE("HTreeEntryIterator::GetNext(): current entry: %lu count: %lu, " - "limit: %lu\n", (uint32)fCurrentEntry, (uint32)fCount, (uint32)fLimit); + TRACE("HTreeEntryIterator::GetNext(): current entry: %u count: %u, " + "limit: %u\n", fCurrentEntry, fCount, fLimit); bool endOfBlock = fCurrentEntry >= (fCount + fFirstEntry); if (endOfBlock) { @@ -231,8 +233,8 @@ HTreeEntryIterator::GetNext(uint32& childBlock) if (status != B_OK) return status; - TRACE("HTreeEntryIterator::GetNext(): moving to next block: %lu\n", - logicalBlock); + TRACE("HTreeEntryIterator::GetNext(): moving to next block: %" B_PRIx32 + "\n", logicalBlock); status = fDirectory->FindBlock(logicalBlock * fBlockSize, fBlockNum); if (status != B_OK) @@ -257,7 +259,7 @@ HTreeEntryIterator::GetNext(uint32& childBlock) if (!endOfBlock) fHasCollision = (entry[fCurrentEntry].Hash() & 1) == 1; - TRACE("HTreeEntryIterator::GetNext(): next block: %lu\n", + TRACE("HTreeEntryIterator::GetNext(): next block: %" B_PRIu32 "\n", entry->Block()); childBlock = entry->Block(); @@ -269,8 +271,8 @@ HTreeEntryIterator::GetNext(uint32& childBlock) uint32 HTreeEntryIterator::BlocksNeededForNewEntry() { - TRACE("HTreeEntryIterator::BlocksNeededForNewEntry(): block num: %llu, " - "volume: %p\n", fBlockNum, fVolume); + TRACE("HTreeEntryIterator::BlocksNeededForNewEntry(): block num: %" + B_PRIu64 ", volume: %p\n", fBlockNum, fVolume); CachedBlock cached(fVolume); const uint8* blockData = cached.SetTo(fBlockNum); @@ -305,7 +307,8 @@ status_t HTreeEntryIterator::InsertEntry(Transaction& transaction, uint32 hash, off_t blockNum, off_t newBlocksPos, bool hasCollision) { - TRACE("HTreeEntryIterator::InsertEntry(): block num: %llu\n", fBlockNum); + TRACE("HTreeEntryIterator::InsertEntry(): block num: %" B_PRIu64 "\n", + fBlockNum); CachedBlock cached(fVolume); uint8* blockData = cached.SetToWritable(transaction, fBlockNum); diff --git a/src/add-ons/kernel/file_systems/ext2/HashRevokeManager.cpp b/src/add-ons/kernel/file_systems/ext2/HashRevokeManager.cpp index 9fdaf7a887..10f3981714 100644 --- a/src/add-ons/kernel/file_systems/ext2/HashRevokeManager.cpp +++ b/src/add-ons/kernel/file_systems/ext2/HashRevokeManager.cpp @@ -134,8 +134,8 @@ HashRevokeManager::Compare(void* _revoked, const void *_block) /*static*/ uint32 HashRevokeManager::Hash(void* _revoked, const void* _block, uint32 range) { - TRACE("HashRevokeManager::Hash(): revoked: %p, block: %p, range: %lu\n", - _revoked, _block, range); + TRACE("HashRevokeManager::Hash(): revoked: %p, block: %p, range: %" + B_PRIu32 "\n", _revoked, _block, range); RevokeElement* revoked = (RevokeElement*)_revoked; if (revoked != NULL) @@ -161,8 +161,8 @@ HashRevokeManager::_ForceInsert(uint32 block, uint32 commitID) if (retValue == B_OK) { fRevokeCount++; - TRACE("HashRevokeManager::_ForceInsert(): revoke count: %lu\n", - fRevokeCount); + TRACE("HashRevokeManager::_ForceInsert(): revoke count: %" B_PRIu32 + "\n", fRevokeCount); } return retValue; diff --git a/src/add-ons/kernel/file_systems/ext2/Inode.cpp b/src/add-ons/kernel/file_systems/ext2/Inode.cpp index 6bffe52dcf..3a07a8c4c8 100644 --- a/src/add-ons/kernel/file_systems/ext2/Inode.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Inode.cpp @@ -43,8 +43,8 @@ Inode::Inode(Volume* volume, ino_t id) rw_lock_init(&fLock, "ext2 inode"); recursive_lock_init(&fSmallDataLock, "ext2 inode small data"); - TRACE("Inode::Inode(): ext2_inode: %lu, disk inode: %lu\n", - sizeof(ext2_inode), fVolume->InodeSize()); + TRACE("Inode::Inode(): ext2_inode: %lu, disk inode: %" B_PRIu32 + "\n", sizeof(ext2_inode), fVolume->InodeSize()); fNodeSize = sizeof(ext2_inode) > fVolume->InodeSize() ? fVolume->InodeSize() : sizeof(ext2_inode); @@ -78,7 +78,7 @@ Inode::Inode(Volume* volume) rw_lock_init(&fLock, "ext2 inode"); recursive_lock_init(&fSmallDataLock, "ext2 inode small data"); - TRACE("Inode::Inode(): ext2_inode: %lu, disk inode: %lu\n", + TRACE("Inode::Inode(): ext2_inode: %lu, disk inode: %" B_PRIu32 "\n", sizeof(ext2_inode), fVolume->InodeSize()); fNodeSize = sizeof(ext2_inode) > fVolume->InodeSize() ? fVolume->InodeSize() : sizeof(ext2_inode); @@ -138,15 +138,16 @@ Inode::WriteBack(Transaction& transaction) if (inodeBlockData == NULL) return B_IO_ERROR; - TRACE("Inode::WriteBack(): Inode ID: %lld, inode block: %llu, data: %p, " - "index: %lu, inode size: %lu, node size: %lu, this: %p, node: %p\n", + TRACE("Inode::WriteBack(): Inode ID: %" B_PRIdINO ", inode block: %" + B_PRIdOFF ", data: %p, index: %" B_PRIu32 ", inode size: %" B_PRIu32 + ", node size: %" B_PRIu32 ", this: %p, node: %p\n", fID, blockNum, inodeBlockData, fVolume->InodeBlockIndex(fID), fVolume->InodeSize(), fNodeSize, this, &fNode); memcpy(inodeBlockData + fVolume->InodeBlockIndex(fID) * fVolume->InodeSize(), (uint8*)&fNode, fNodeSize); - TRACE("Inode::WriteBack() finished %ld\n", Node().stream.direct[0]); + TRACE("Inode::WriteBack() finished %" B_PRId32 "\n", Node().stream.direct[0]); return B_OK; } @@ -161,7 +162,7 @@ Inode::UpdateNodeFromDisk() if (status != B_OK) return status; - TRACE("inode %lld at block %llu\n", fID, blockNum); + TRACE("inode %" B_PRIdINO " at block %" B_PRIdOFF "\n", fID, blockNum); CachedBlock cached(fVolume); const uint8* inodeBlock = cached.SetTo(blockNum); @@ -169,13 +170,13 @@ Inode::UpdateNodeFromDisk() if (inodeBlock == NULL) return B_IO_ERROR; - TRACE("Inode size: %lu, inode index: %lu\n", fVolume->InodeSize(), - fVolume->InodeBlockIndex(fID)); + TRACE("Inode size: %" B_PRIu32 ", inode index: %" B_PRIu32 "\n", + fVolume->InodeSize(), fVolume->InodeBlockIndex(fID)); ext2_inode* inode = (ext2_inode*)(inodeBlock + fVolume->InodeBlockIndex(fID) * fVolume->InodeSize()); TRACE("Attempting to copy inode data from %p to %p, ext2_inode " - "size: %lu\n", inode, &fNode, fNodeSize); + "size: %" B_PRIu32 "\n", inode, &fNode, fNodeSize); memcpy(&fNode, inode, fNodeSize); @@ -244,13 +245,14 @@ Inode::ReadAt(off_t pos, uint8* buffer, size_t* _length) // set/check boundaries for pos/length if (pos < 0) { - ERROR("inode %lld: ReadAt failed(pos %lld, length %lu)\n", ID(), pos, - length); + ERROR("inode %" B_PRIdINO ": ReadAt failed(pos %" B_PRIdOFF + ", length %" B_PRIuSIZE ")\n", ID(), pos, length); return B_BAD_VALUE; } if (pos >= Size() || length == 0) { - TRACE("inode %lld: ReadAt 0 (pos %lld, length %lu)\n", ID(), pos, length); + TRACE("inode %" B_PRIdINO ": ReadAt 0 (pos %" B_PRIdOFF ", length %" + B_PRIuSIZE ")\n", ID(), pos, length); *_length = 0; return B_NO_ERROR; } @@ -263,8 +265,8 @@ status_t Inode::WriteAt(Transaction& transaction, off_t pos, const uint8* buffer, size_t* _length) { - TRACE("Inode::WriteAt(%lld, %p, *(%p) = %ld)\n", pos, buffer, - _length, *_length); + TRACE("Inode::WriteAt(%" B_PRIdOFF ", %p, *(%p) = %" B_PRIuSIZE ")\n", pos, + buffer, _length, *_length); ReadLocker readLocker(fLock); if (IsFileCacheDisabled()) @@ -296,9 +298,10 @@ Inode::WriteAt(Transaction& transaction, off_t pos, const uint8* buffer, off_t end = pos + (off_t)length; off_t oldSize = Size(); - TRACE("Inode::WriteAt(): Old size: %x:%x, new size: %x:%x\n", - (int)(oldSize >> 32), (int)(oldSize & 0xFFFFFFFF), - (int)(end >> 32), (int)(end & 0xFFFFFFFF)); + TRACE("Inode::WriteAt(): Old size: %" B_PRIdOFF ":%" B_PRIdOFF + ", new size: %" B_PRIdOFF ":%" B_PRIdOFF "\n", + oldSize >> 32, oldSize & 0xFFFFFFFF, + end >> 32, end & 0xFFFFFFFF); if (end > oldSize) { status_t status = Resize(transaction, end); @@ -326,9 +329,10 @@ Inode::WriteAt(Transaction& transaction, off_t pos, const uint8* buffer, return B_OK; } - TRACE("Inode::WriteAt(): Performing write: %p, %lld, %p, %ld\n", - FileCache(), pos, buffer, *_length); - status_t status = file_cache_write(FileCache(), NULL, pos, buffer, _length); + TRACE("Inode::WriteAt(): Performing write: %p, %" B_PRIdOFF ", %p, %" + B_PRIuSIZE "\n", FileCache(), pos, buffer, *_length); + status_t status = file_cache_write(FileCache(), NULL, pos, buffer, + _length); WriteLockInTransaction(transaction); @@ -341,7 +345,8 @@ Inode::WriteAt(Transaction& transaction, off_t pos, const uint8* buffer, status_t Inode::FillGapWithZeros(off_t start, off_t end) { - TRACE("Inode::FileGapWithZeros(%lld - %lld)\n", start, end); + TRACE("Inode::FileGapWithZeros(%" B_PRIdOFF " - %" B_PRIdOFF ")\n", start, + end); while (start < end) { size_t size; @@ -352,7 +357,8 @@ Inode::FillGapWithZeros(off_t start, off_t end) size = end - start; TRACE("Inode::FillGapWithZeros(): Calling file_cache_write(%p, NULL, " - "%lld, NULL, &(%ld) = %p)\n", fCache, start, size, &size); + "%" B_PRIdOFF ", NULL, &(%" B_PRIuSIZE ") = %p)\n", fCache, start, + size, &size); status_t status = file_cache_write(fCache, NULL, start, NULL, &size); if (status != B_OK) @@ -368,7 +374,8 @@ Inode::FillGapWithZeros(off_t start, off_t end) status_t Inode::Resize(Transaction& transaction, off_t size) { - TRACE("Inode::Resize() ID:%lld size: %lld\n", ID(), size); + TRACE("Inode::Resize() ID:%" B_PRIdINO " size: %" B_PRIdOFF "\n", ID(), + size); if (size < 0) return B_BAD_VALUE; @@ -377,7 +384,8 @@ Inode::Resize(Transaction& transaction, off_t size) if (size == oldSize) return B_OK; - TRACE("Inode::Resize(): old size: %lld, new size: %lld\n", oldSize, size); + TRACE("Inode::Resize(): old size: %" B_PRIdOFF ", new size: %" B_PRIdOFF + "\n", oldSize, size); status_t status; if (size > oldSize) { @@ -397,7 +405,8 @@ Inode::Resize(Transaction& transaction, off_t size) file_cache_set_size(FileCache(), size); file_map_set_size(Map(), size); - TRACE("Inode::Resize(): Writing back inode changes. Size: %lld\n", Size()); + TRACE("Inode::Resize(): Writing back inode changes. Size: %" B_PRIdOFF + "\n", Size()); return WriteBack(transaction); } @@ -451,7 +460,7 @@ status_t Inode::Unlink(Transaction& transaction) { uint32 numLinks = fNode.NumLinks(); - TRACE("Inode::Unlink(): Current links: %lu\n", numLinks); + TRACE("Inode::Unlink(): Current links: %" B_PRIu32 "\n", numLinks); if (numLinks == 0) return B_BAD_VALUE; @@ -727,8 +736,8 @@ Inode::EnableFileCache() return B_OK; } - TRACE("Inode::EnableFileCache(): Creating file cache: %ld, %lld, %lld\n", - fVolume->ID(), ID(), Size()); + TRACE("Inode::EnableFileCache(): Creating file cache: %" B_PRIu32 ", %" + B_PRIdINO ", %" B_PRIdOFF "\n", fVolume->ID(), ID(), Size()); fCache = file_cache_create(fVolume->ID(), ID(), Size()); fMap = file_map_create(fVolume->ID(), ID(), Size()); @@ -819,7 +828,8 @@ Inode::_EnlargeDataStream(Transaction& transaction, off_t size) if (size <= maxSize) { // No need to allocate more blocks TRACE("Inode::_EnlargeDataStream(): No need to allocate more blocks\n"); - TRACE("Inode::_EnlargeDataStream(): Setting size to %Ld\n", size); + TRACE("Inode::_EnlargeDataStream(): Setting size to %" B_PRIdOFF "\n", + size); fNode.SetSize(size); return B_OK; } @@ -833,10 +843,11 @@ Inode::_EnlargeDataStream(Transaction& transaction, off_t size) DataStream stream(fVolume, &fNode.stream, oldSize); stream.Enlarge(transaction, end); } - TRACE("Inode::_EnlargeDataStream(): Setting size to %lld\n", size); + TRACE("Inode::_EnlargeDataStream(): Setting size to %" B_PRIdOFF "\n", + size); fNode.SetSize(size); - TRACE("Inode::_EnlargeDataStream(): Setting allocated block count to %llu\n", - end); + TRACE("Inode::_EnlargeDataStream(): Setting allocated block count to %" + B_PRIdOFF "\n", end); return _SetNumBlocks(_NumBlocks() + end * (fVolume->BlockSize() / 512)); } @@ -858,7 +869,8 @@ Inode::_ShrinkDataStream(Transaction& transaction, off_t size) if (size > minSize) { // No need to allocate more blocks TRACE("Inode::_ShrinkDataStream(): No need to allocate more blocks\n"); - TRACE("Inode::_ShrinkDataStream(): Setting size to %lld\n", size); + TRACE("Inode::_ShrinkDataStream(): Setting size to %" B_PRIdOFF "\n", + size); fNode.SetSize(size); return B_OK; } diff --git a/src/add-ons/kernel/file_systems/ext2/Inode.h b/src/add-ons/kernel/file_systems/ext2/Inode.h index b126996f90..098f83542b 100644 --- a/src/add-ons/kernel/file_systems/ext2/Inode.h +++ b/src/add-ons/kernel/file_systems/ext2/Inode.h @@ -224,10 +224,10 @@ public: status_t status = B_OK; if (!inode->IsSymLink() && volume->ID() >= 0) { - TRACEI("Vnode::Publish(): Publishing vnode: %d, %d, %p, %p, %x, " - "%x\n", (int)volume->FSVolume(), (int)inode->ID(), inode, - vnodeOps != NULL ? vnodeOps : &gExt2VnodeOps, (int)inode->Mode(), - (int)publishFlags); + TRACEI("Vnode::Publish(): Publishing volume: %p, %" B_PRIdINO + ", %p, %p, %" B_PRIu16 ", %" B_PRIx32 "\n", volume->FSVolume(), + inode->ID(), inode, vnodeOps != NULL ? vnodeOps : &gExt2VnodeOps, + inode->Mode(), publishFlags); status = publish_vnode(volume->FSVolume(), inode->ID(), inode, vnodeOps != NULL ? vnodeOps : &gExt2VnodeOps, inode->Mode(), publishFlags); diff --git a/src/add-ons/kernel/file_systems/ext2/InodeAllocator.cpp b/src/add-ons/kernel/file_systems/ext2/InodeAllocator.cpp index 9ac91ee79a..04186c45d7 100644 --- a/src/add-ons/kernel/file_systems/ext2/InodeAllocator.cpp +++ b/src/add-ons/kernel/file_systems/ext2/InodeAllocator.cpp @@ -139,7 +139,7 @@ InodeAllocator::_AllocateInGroup(Transaction& transaction, uint32 blockGroup, uint32 freeInodes = group->FreeInodes(fVolume->Has64bitFeature()); if (freeInodes == 0) return B_DEVICE_FULL; - TRACE("InodeAllocator::_Allocate() freeInodes %ld\n", + TRACE("InodeAllocator::_Allocate() freeInodes %" B_PRId32 "\n", freeInodes); group->SetFreeInodes(freeInodes - 1, fVolume->Has64bitFeature()); if (isDirectory) { @@ -177,8 +177,8 @@ InodeAllocator::_MarkInBitmap(Transaction& transaction, fsblock_t bitmapBlock, BitmapBlock inodeBitmap(fVolume, numInodes); if (!inodeBitmap.SetToWritable(transaction, bitmapBlock)) { - ERROR("Unable to open inode bitmap (block number: %llu) for block group " - "%lu\n", bitmapBlock, blockGroup); + ERROR("Unable to open inode bitmap (block number: %" B_PRIu64 + ") for block group %" B_PRIu32 "\n", bitmapBlock, blockGroup); return B_IO_ERROR; } @@ -186,15 +186,16 @@ InodeAllocator::_MarkInBitmap(Transaction& transaction, fsblock_t bitmapBlock, inodeBitmap.FindNextUnmarked(pos); if (pos == inodeBitmap.NumBits()) { - ERROR("Even though the block group %lu indicates there are free " - "inodes, no unmarked bit was found in the inode bitmap at block " - "%llu (numInodes %lu).\n", blockGroup, bitmapBlock, numInodes); + ERROR("Even though the block group %" B_PRIu32 " indicates there are " + "free inodes, no unmarked bit was found in the inode bitmap at " + "block %" B_PRIu64 " (numInodes %" B_PRIu32 ").\n", blockGroup, + bitmapBlock, numInodes); return B_ERROR; } if (!inodeBitmap.Mark(pos, 1)) { - ERROR("Failed to mark bit %lu at bitmap block %llu\n", pos, - bitmapBlock); + ERROR("Failed to mark bit %" B_PRIu32 " at bitmap block %" B_PRIu64 + "\n", pos, bitmapBlock); return B_BAD_DATA; } @@ -209,14 +210,15 @@ InodeAllocator::_UnmarkInBitmap(Transaction& transaction, fsblock_t bitmapBlock, BitmapBlock inodeBitmap(fVolume, numInodes); if (!inodeBitmap.SetToWritable(transaction, bitmapBlock)) { - ERROR("Unable to open inode bitmap at block %llu\n", bitmapBlock); + ERROR("Unable to open inode bitmap at block %" B_PRIu64 "\n", + bitmapBlock); return B_IO_ERROR; } uint32 pos = (id - 1) % fVolume->InodesPerGroup(); if (!inodeBitmap.Unmark(pos, 1)) { - ERROR("Unable to unmark bit %lu in inode bitmap block %llu\n", pos, - bitmapBlock); + ERROR("Unable to unmark bit %" B_PRIu32 " in inode bitmap block %" + B_PRIu64 "\n", pos, bitmapBlock); return B_BAD_DATA; } diff --git a/src/add-ons/kernel/file_systems/ext2/Journal.cpp b/src/add-ons/kernel/file_systems/ext2/Journal.cpp index ab65174a46..7efea26d13 100644 --- a/src/add-ons/kernel/file_systems/ext2/Journal.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Journal.cpp @@ -268,7 +268,7 @@ Journal::Lock(Transaction* owner, bool separateSubTransactions) /*virtual*/ status_t Journal::Unlock(Transaction* owner, bool success) { - TRACE("Journal::Unlock(): Lock recursion: %ld\n", + TRACE("Journal::Unlock(): Lock recursion: %" B_PRId32 "\n", recursive_lock_get_recursion(&fLock)); if (fSeparateSubTransactions || recursive_lock_get_recursion(&fLock) == 1) { @@ -317,8 +317,8 @@ Journal::MapBlock(off_t logical, fsblock_t& physical) inline uint32 Journal::FreeLogBlocks() const { - TRACE("Journal::FreeLogBlocks(): start: %lu, end: %lu, size: %lu\n", - fLogStart, fLogEnd, fLogSize); + TRACE("Journal::FreeLogBlocks(): start: %" B_PRIu32 ", end: %" B_PRIu32 + ", size: %" B_PRIu32 "\n", fLogStart, fLogEnd, fLogSize); return fLogStart <= fLogEnd ? fLogSize - fLogEnd + fLogStart - 1 : fLogStart - fLogEnd; @@ -381,7 +381,7 @@ Journal::_WritePartialTransactionToLog(JournalHeader* descriptorBlock, if (escapedData == NULL) { TRACE("Journal::_WritePartialTransactionToLog(): Allocating " - "space for escaped block (%lu)\n", fBlockSize); + "space for escaped block (%" B_PRIu32 ")\n", fBlockSize); escapedData = new(std::nothrow) uint8[fBlockSize]; if (escapedData == NULL) { TRACE("Journal::_WritePartialTransactionToLof(): Failed to " @@ -411,7 +411,7 @@ Journal::_WritePartialTransactionToLog(JournalHeader* descriptorBlock, off_t logOffset = physicalBlock * fBlockSize; TRACE("Journal::_WritePartialTransactionToLog(): Writing from memory: " - "%p, to disk: %llu\n", finalData, logOffset); + "%p, to disk: %" B_PRIdOFF "\n", finalData, logOffset); size_t written = write_pos(fJournalVolume->Device(), logOffset, finalData, fBlockSize); if (written != fBlockSize) { @@ -420,7 +420,7 @@ Journal::_WritePartialTransactionToLog(JournalHeader* descriptorBlock, } TRACE("Journal::_WritePartialTransactionToLog(): Wrote a journal block " - "at: %lu\n", logBlock); + "at: %" B_PRIu32 "\n", logBlock); blockCount++; tag++; @@ -442,8 +442,8 @@ Journal::_WritePartialTransactionToLog(JournalHeader* descriptorBlock, off_t descriptorBlockOffset = physicalBlock * fBlockSize; - TRACE("Journal::_WritePartialTransactionToLog(): Writing to: %lld\n", - descriptorBlockOffset); + TRACE("Journal::_WritePartialTransactionToLog(): Writing to: %" B_PRIdOFF + "\n", descriptorBlockOffset); size_t written = write_pos(fJournalVolume->Device(), descriptorBlockOffset, descriptorBlock, fBlockSize); if (written != fBlockSize) { @@ -467,14 +467,15 @@ Journal::_WriteTransactionToLog() TRACE("Journal::_WriteTransactionToLog(): Attempting to get transaction " "size\n"); size_t size = _FullTransactionSize(); - TRACE("Journal::_WriteTransactionToLog(): transaction size: %lu\n", size); + TRACE("Journal::_WriteTransactionToLog(): transaction size: %" B_PRIuSIZE + "\n", size); if (size > fMaxTransactionSize) { TRACE("Journal::_WriteTransactionToLog(): not enough free space " "for the transaction. Attempting to free some space.\n"); size = _MainTransactionSize(); - TRACE("Journal::_WriteTransactionToLog(): main transaction size: %lu\n", - size); + TRACE("Journal::_WriteTransactionToLog(): main transaction size: %" + B_PRIuSIZE "\n", size); if(fHasSubTransaction && size < fMaxTransactionSize) { TRACE("Journal::_WriteTransactionToLog(): transaction doesn't fit, " @@ -482,22 +483,23 @@ Journal::_WriteTransactionToLog() detached = true; } else { // Error: transaction can't fit in log - panic("transaction too large (size: %lu, max size: %lu, log size: " - "%lu)\n", size, fMaxTransactionSize, fLogSize); + panic("transaction too large (size: %" B_PRIuSIZE ", max size: %" + B_PRIu32 ", log size: %" B_PRIu32 ")\n", size, + fMaxTransactionSize, fLogSize); return B_BUFFER_OVERFLOW; } } - TRACE("Journal::_WriteTransactionToLog(): free log blocks: %lu\n", - FreeLogBlocks()); + TRACE("Journal::_WriteTransactionToLog(): free log blocks: %" B_PRIu32 + "\n", FreeLogBlocks()); if (size > FreeLogBlocks()) { TRACE("Journal::_WriteTransactionToLog(): Syncing block cache\n"); cache_sync_transaction(fFilesystemBlockCache, fTransactionID); if (size > FreeLogBlocks()) { panic("Transaction fits, but sync didn't result in enough" - "free space.\n\tGot %ld when at least %ld was expected.", - FreeLogBlocks(), size); + "free space.\n\tGot %" B_PRIu32 " when at least %" B_PRIuSIZE + " was expected.", FreeLogBlocks(), size); } } @@ -510,7 +512,7 @@ Journal::_WriteTransactionToLog() // Prepare Descriptor block TRACE("Journal::_WriteTransactionToLog(): attempting to allocate space for " - "the descriptor block, block size %lu\n", fBlockSize); + "the descriptor block, block size %" B_PRIu32 "\n", fBlockSize); JournalHeader* descriptorBlock = (JournalHeader*)new(std::nothrow) uint8[fBlockSize]; if (descriptorBlock == NULL) { @@ -524,7 +526,7 @@ Journal::_WriteTransactionToLog() // Prepare Commit block TRACE("Journal::_WriteTransactionToLog(): attempting to allocate space for " - "the commit block, block size %lu\n", fBlockSize); + "the commit block, block size %" B_PRIu32 "\n", fBlockSize); JournalHeader* commitBlock = (JournalHeader*)new(std::nothrow) uint8[fBlockSize]; if (descriptorBlock == NULL) { @@ -588,7 +590,7 @@ Journal::_WriteTransactionToLog() off_t logOffset = physicalBlock * fBlockSize; TRACE("Journal::_WriteTransactionToLog(): Writting commit block to " - "%lld\n", logOffset); + "%" B_PRIdOFF "\n", logOffset); off_t written = write_pos(fJournalVolume->Device(), logOffset, commitBlock, fBlockSize); if (written != fBlockSize) { @@ -610,7 +612,8 @@ Journal::_WriteTransactionToLog() off_t logOffset = physicalBlock * fBlockSize; - TRACE("Journal::_WriteTransactionToLog(): Writing to: %lld\n", logOffset); + TRACE("Journal::_WriteTransactionToLog(): Writing to: %" B_PRIdOFF "\n", + logOffset); off_t written = write_pos(fJournalVolume->Device(), logOffset, commitBlock, fBlockSize); if (written != fBlockSize) { @@ -644,8 +647,8 @@ Journal::_WriteTransactionToLog() if (status == B_OK && _FullTransactionSize() > fLogSize) { // If the transaction is too large after writing, there is no way to // recover, so let this transaction fail. - ERROR("transaction too large (%ld blocks, log size %ld)!\n", - _FullTransactionSize(), fLogSize); + ERROR("transaction too large (%" B_PRIuSIZE " blocks, log size %" + B_PRIu32 ")!\n", _FullTransactionSize(), fLogSize); return B_BUFFER_OVERFLOW; } } else { @@ -679,7 +682,8 @@ Journal::_SaveSuperBlock() superblock.SetFirstCommitID(fFirstCommitID); superblock.SetLogStart(fLogStart); - TRACE("Journal::SaveSuperBlock(): Write to %lld\n", superblockPos); + TRACE("Journal::SaveSuperBlock(): Write to %" B_PRIdOFF "\n", + superblockPos); size_t bytesWritten = write_pos(fJournalVolume->Device(), superblockPos, &superblock, sizeof(superblock)); @@ -702,8 +706,8 @@ Journal::_LoadSuperBlock() if (status != B_OK) return status; - TRACE("Journal::_LoadSuperBlock(): superblock physical block: %llu\n", - superblockPos); + TRACE("Journal::_LoadSuperBlock(): superblock physical block: %" B_PRIu64 + "\n", superblockPos); JournalSuperBlock superblock; size_t bytesRead = read_pos(fJournalVolume->Device(), superblockPos @@ -715,8 +719,8 @@ Journal::_LoadSuperBlock() } if (!superblock.header.CheckMagic()) { - ERROR("Journal::_LoadSuperBlock(): Invalid superblock magic %lX\n", - superblock.header.Magic()); + ERROR("Journal::_LoadSuperBlock(): Invalid superblock magic %" B_PRIx32 + "\n", superblock.header.Magic()); return B_BAD_VALUE; } @@ -757,9 +761,10 @@ Journal::_LoadSuperBlock() // TODO: Why is "superblock.MaxTransactionBlocks();" zero? //fFirstCacheCommitID = fFirstCommitID - fTransactionID /*+ 1*/; - TRACE("Journal::_LoadSuperBlock(): block size: %lu, first commit id: %lu, " - "first log block: %lu, log start: %lu, log size: %lu, max transaction " - "size: %lu\n", fBlockSize, fFirstCommitID, fFirstLogBlock, fLogStart, + TRACE("Journal::_LoadSuperBlock(): block size: %" B_PRIu32 ", first commit" + " id: %" B_PRIu32 ", first log block: %" B_PRIu32 ", log start: %" + B_PRIu32 ", log size: %" B_PRIu32 ", max transaction size: %" B_PRIu32 + "\n", fBlockSize, fFirstCommitID, fFirstLogBlock, fLogStart, fLogSize, fMaxTransactionSize); return B_OK; @@ -795,7 +800,8 @@ Journal::_CountTags(JournalHeader* descriptorBlock) tags += 2; // Skip new UUID } - TRACE("Journal::_CountTags(): Tag block: %lu\n", tags->BlockNumber()); + TRACE("Journal::_CountTags(): Tag block: %" B_PRIu32 "\n", + tags->BlockNumber()); tags++; // Go to next tag count++; @@ -804,7 +810,7 @@ Journal::_CountTags(JournalHeader* descriptorBlock) if ((tags->Flags() & JOURNAL_FLAG_LAST_TAG) != 0) count++; - TRACE("Journal::_CountTags(): counted tags: %lu\n", count); + TRACE("Journal::_CountTags(): counted tags: %" B_PRIu32 "\n", count); return count; } @@ -858,11 +864,11 @@ Journal::_RecoverPassScan(uint32& lastCommitID) uint32 tags = _CountTags(header); nextBlock += tags; TRACE("Journal recover pass scan: Found a descriptor block with " - "%lu tags\n", tags); + "%" B_PRIu32 " tags\n", tags); } else if (blockType == JOURNAL_COMMIT_BLOCK) { nextCommitID++; TRACE("Journal recover pass scan: Found a commit block. Next " - "commit ID: %lu\n", nextCommitID); + "commit ID: %" B_PRIu32 "\n", nextCommitID); } else if (blockType != JOURNAL_REVOKE_BLOCK) { TRACE("Journal recover pass scan: Reached an unrecognized block, " "assuming as log's end.\n"); @@ -881,8 +887,8 @@ Journal::_RecoverPassScan(uint32& lastCommitID) header = (JournalHeader*)cached.SetTo(nextBlockPos); } - TRACE("Journal Recovery pass scan: Last detected transaction ID: %lu\n", - nextCommitID); + TRACE("Journal Recovery pass scan: Last detected transaction ID: %" + B_PRIu32 "\n", nextCommitID); lastCommitID = nextCommitID; return B_OK; @@ -946,7 +952,7 @@ Journal::_RecoverPassRevoke(uint32 lastCommitID) return B_ERROR; } - TRACE("Journal recovery pass revoke: Revoked blocks: %lu\n", + TRACE("Journal recovery pass revoke: Revoked blocks: %" B_PRIu32 "\n", fRevokeManager->NumRevokes()); return B_OK; @@ -1016,8 +1022,8 @@ Journal::_RecoverPassReplay(uint32 lastCommitID) = B_HOST_TO_BENDIAN_INT32(JOURNAL_MAGIC); } - TRACE("Journal::_RevoverPassReplay(): Write to %lu\n", - tag->BlockNumber() * fBlockSize); + TRACE("Journal::_RevoverPassReplay(): Write to %" B_PRIu32 + "\n", tag->BlockNumber() * fBlockSize); size_t written = write_pos(fFilesystemVolume->Device(), tag->BlockNumber() * fBlockSize, data, fBlockSize); @@ -1070,7 +1076,7 @@ Journal::_FlushLog(bool canWait, bool flushBlocks) status_t status = canWait ? recursive_lock_lock(&fLock) : recursive_lock_trylock(&fLock); - TRACE("Journal::_FlushLog(): Acquired fLock, recursion: %ld\n", + TRACE("Journal::_FlushLog(): Acquired fLock, recursion: %" B_PRId32 "\n", recursive_lock_get_recursion(&fLock)); if (status != B_OK) return status; @@ -1131,7 +1137,7 @@ Journal::_WrapAroundLog(uint32 block) size_t Journal::_CurrentTransactionSize() const { - TRACE("Journal::_CurrentTransactionSize(): transaction %ld\n", + TRACE("Journal::_CurrentTransactionSize(): transaction %" B_PRIu32 "\n", fTransactionID); size_t count; @@ -1140,12 +1146,12 @@ Journal::_CurrentTransactionSize() const count = cache_blocks_in_sub_transaction(fFilesystemBlockCache, fTransactionID); - TRACE("\tSub transaction size: %ld\n", count); + TRACE("\tSub transaction size: %" B_PRIuSIZE "\n", count); } else { count = cache_blocks_in_transaction(fFilesystemBlockCache, fTransactionID); - TRACE("\tTransaction size: %ld\n", count); + TRACE("\tTransaction size: %" B_PRIuSIZE "\n", count); } return count; @@ -1155,13 +1161,14 @@ Journal::_CurrentTransactionSize() const size_t Journal::_FullTransactionSize() const { - TRACE("Journal::_FullTransactionSize(): transaction %ld\n", fTransactionID); + TRACE("Journal::_FullTransactionSize(): transaction %" B_PRIu32 "\n", + fTransactionID); TRACE("\tFile sytem block cache: %p\n", fFilesystemBlockCache); size_t count = cache_blocks_in_transaction(fFilesystemBlockCache, fTransactionID); - TRACE("\tFull transaction size: %ld\n", count); + TRACE("\tFull transaction size: %" B_PRIuSIZE "\n", count); return count; } @@ -1170,12 +1177,13 @@ Journal::_FullTransactionSize() const size_t Journal::_MainTransactionSize() const { - TRACE("Journal::_MainTransactionSize(): transaction %ld\n", fTransactionID); + TRACE("Journal::_MainTransactionSize(): transaction %" B_PRIu32 "\n", + fTransactionID); size_t count = cache_blocks_in_main_transaction(fFilesystemBlockCache, fTransactionID); - TRACE("\tMain transaction size: %ld\n", count); + TRACE("\tMain transaction size: %" B_PRIuSIZE "\n", count); return count; } @@ -1186,13 +1194,13 @@ Journal::_TransactionDone(bool success) { if (!success) { if (fHasSubTransaction) { - TRACE("Journal::_TransactionDone(): transaction %ld failed, " - "aborting subtransaction\n", fTransactionID); + TRACE("Journal::_TransactionDone(): transaction %" B_PRIu32 + " failed, aborting subtransaction\n", fTransactionID); cache_abort_sub_transaction(fFilesystemBlockCache, fTransactionID); // parent is unaffected } else { - TRACE("Journal::_TransactionDone(): transaction %ld failed," - " aborting\n", fTransactionID); + TRACE("Journal::_TransactionDone(): transaction %" B_PRIu32 + " failed, aborting\n", fTransactionID); cache_abort_transaction(fFilesystemBlockCache, fTransactionID); fUnwrittenTransactions = 0; } @@ -1203,12 +1211,12 @@ Journal::_TransactionDone(bool success) // If possible, delay flushing the transaction uint32 size = _FullTransactionSize(); - TRACE("Journal::_TransactionDone(): full transaction size: %lu, max " - "transaction size: %lu, free log blocks: %lu\n", size, - fMaxTransactionSize, FreeLogBlocks()); + TRACE("Journal::_TransactionDone(): full transaction size: %" B_PRIu32 + ", max transaction size: %" B_PRIu32 ", free log blocks: %" B_PRIu32 + "\n", size, fMaxTransactionSize, FreeLogBlocks()); if (fMaxTransactionSize > 0 && size < fMaxTransactionSize) { TRACE("Journal::_TransactionDone(): delaying flush of transaction " - "%ld\n", fTransactionID); + "%" B_PRIu32 "\n", fTransactionID); // Make sure the transaction fits in the log if (size < FreeLogBlocks()) @@ -1228,8 +1236,8 @@ Journal::_TransactionWritten(int32 transactionID, int32 event, void* _logEntry) { LogEntry* logEntry = (LogEntry*)_logEntry; - TRACE("Journal::_TransactionWritten(): Transaction %ld checkpointed\n", - transactionID); + TRACE("Journal::_TransactionWritten(): Transaction %" B_PRIu32 + " checkpointed\n", transactionID); Journal* journal = logEntry->GetJournal(); @@ -1243,12 +1251,12 @@ Journal::_TransactionWritten(int32 transactionID, int32 event, void* _logEntry) TRACE("Journal::_TransactionWritten(): first log entry: %p\n", journal->fLogEntries.First()); if (logEntry == journal->fLogEntries.First()) { - TRACE("Journal::_TransactionWritten(): Moving start of log to %lu\n", - logEntry->Start()); + TRACE("Journal::_TransactionWritten(): Moving start of log to %" + B_PRIu32 "\n", logEntry->Start()); journal->fLogStart = logEntry->Start(); journal->fFirstCommitID = logEntry->CommitID(); - TRACE("Journal::_TransactionWritten(): Setting commit ID to %lu\n", - logEntry->CommitID()); + TRACE("Journal::_TransactionWritten(): Setting commit ID to %" B_PRIu32 + "\n", logEntry->CommitID()); if (journal->_SaveSuperBlock() != B_OK) panic("ext2: Failed to write journal superblock\n"); diff --git a/src/add-ons/kernel/file_systems/ext2/NoJournal.cpp b/src/add-ons/kernel/file_systems/ext2/NoJournal.cpp index d6230376eb..3d01b1c1a7 100644 --- a/src/add-ons/kernel/file_systems/ext2/NoJournal.cpp +++ b/src/add-ons/kernel/file_systems/ext2/NoJournal.cpp @@ -84,8 +84,8 @@ NoJournal::Unlock(Transaction* owner, bool success) status_t NoJournal::_WriteTransactionToLog() { - TRACE("NoJournal::_WriteTransactionToLog(): Ending transaction %ld\n", - fTransactionID); + TRACE("NoJournal::_WriteTransactionToLog(): Ending transaction %" B_PRId32 + "\n", fTransactionID); fTransactionID = cache_end_transaction(fFilesystemBlockCache, fTransactionID, _TransactionWritten, NULL); @@ -97,5 +97,5 @@ NoJournal::_WriteTransactionToLog() /*static*/ void NoJournal::_TransactionWritten(int32 transactionID, int32 event, void* param) { - TRACE("Transaction %ld checkpointed\n", transactionID); + TRACE("Transaction %" B_PRId32" checkpointed\n", transactionID); } diff --git a/src/add-ons/kernel/file_systems/ext2/RevokeManager.cpp b/src/add-ons/kernel/file_systems/ext2/RevokeManager.cpp index 1e15f652bf..e8ed581dc7 100644 --- a/src/add-ons/kernel/file_systems/ext2/RevokeManager.cpp +++ b/src/add-ons/kernel/file_systems/ext2/RevokeManager.cpp @@ -31,14 +31,16 @@ RevokeManager::~RevokeManager() status_t -RevokeManager::ScanRevokeBlock(JournalRevokeHeader* revokeBlock, uint32 commitID) +RevokeManager::ScanRevokeBlock(JournalRevokeHeader* revokeBlock, + uint32 commitID) { - TRACE("RevokeManager::ScanRevokeBlock(): Commit ID: %lu\n", commitID); + TRACE("RevokeManager::ScanRevokeBlock(): Commit ID: %" B_PRIu32 "\n", + commitID); int count = revokeBlock->NumBytes() / 4; for (int i = 0; i < count; ++i) { - TRACE("RevokeManager::ScanRevokeBlock(): Found a revoked block: %lu\n", - revokeBlock->RevokeBlock(i)); + TRACE("RevokeManager::ScanRevokeBlock(): Found a revoked block: %" + B_PRIu32 "\n", revokeBlock->RevokeBlock(i)); status_t status = Insert(revokeBlock->RevokeBlock(i), commitID); if (status != B_OK) { diff --git a/src/add-ons/kernel/file_systems/ext2/Transaction.cpp b/src/add-ons/kernel/file_systems/ext2/Transaction.cpp index 834da245aa..e69a6aec9c 100644 --- a/src/add-ons/kernel/file_systems/ext2/Transaction.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Transaction.cpp @@ -187,11 +187,11 @@ Transaction::NotifyListeners(bool success) TRACE("Transaction::NotifyListeners(): fListeners.First(): %p\n", fListeners.First()); if (success) { - TRACE("Transaction::NotifyListeners(true): Number of listeners: %ld\n", - fListeners.Count()); + TRACE("Transaction::NotifyListeners(true): Number of listeners: %" + B_PRId32 "\n", fListeners.Count()); } else { - TRACE("Transaction::NotifyListeners(false): Number of listeners: %ld\n", - fListeners.Count()); + TRACE("Transaction::NotifyListeners(false): Number of listeners: %" + B_PRId32 "\n", fListeners.Count()); } TRACE("Transaction::NotifyListeners(): Finished counting\n"); diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.cpp b/src/add-ons/kernel/file_systems/ext2/Volume.cpp index b833eee746..629cec7dc6 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Volume.cpp @@ -296,7 +296,8 @@ Volume::Mount(const char* deviceName, uint32 flags) if (opener.IsReadOnly()) fFlags |= VOLUME_READ_ONLY; - TRACE("features %lx, incompatible features %lx, read-only features %lx\n", + TRACE("features %" B_PRIx32 ", incompatible features %" B_PRIx32 + ", read-only features %" B_PRIx32 "\n", fSuperBlock.CompatibleFeatures(), fSuperBlock.IncompatibleFeatures(), fSuperBlock.ReadOnlyFeatures()); @@ -336,8 +337,9 @@ Volume::Mount(const char* deviceName, uint32 flags) fGroupsPerBlock = fBlockSize / fGroupDescriptorSize; fNumInodes = fSuperBlock.NumInodes(); - TRACE("block size %ld, num groups %ld, groups per block %ld, first %lu\n", - fBlockSize, fNumGroups, fGroupsPerBlock, fFirstDataBlock); + TRACE("block size %" B_PRIu32 ", num groups %" B_PRIu32 ", groups per " + "block %" B_PRIu32 ", first %" B_PRIu32 "\n", fBlockSize, fNumGroups, + fGroupsPerBlock, fFirstDataBlock); uint32 blockCount = (fNumGroups + fGroupsPerBlock - 1) / fGroupsPerBlock; @@ -523,8 +525,8 @@ Volume::_UnsupportedIncompatibleFeatures(ext2_super_block& superBlock) & ~supportedIncompatible; if (unsupported != 0) { - FATAL("ext2: incompatible features not supported: %lx (extents %x)\n", - unsupported, EXT2_INCOMPATIBLE_FEATURE_EXTENTS); + FATAL("ext2: incompatible features not supported: %" B_PRIx32 + " (extents %x)\n", unsupported, EXT2_INCOMPATIBLE_FEATURE_EXTENTS); } return unsupported; @@ -545,8 +547,10 @@ Volume::_UnsupportedReadOnlyFeatures(ext2_super_block& superBlock) uint32 unsupported = superBlock.ReadOnlyFeatures() & ~supportedReadOnly; - if (unsupported != 0) - FATAL("ext2: readonly features not supported: %lx\n", unsupported); + if (unsupported != 0) { + FATAL("ext2: readonly features not supported: %" B_PRIx32 "\n", + unsupported); + } return unsupported; } @@ -611,8 +615,8 @@ Volume::GetBlockGroup(int32 index, ext2_block_group** _group) memcpy(fGroupBlocks[blockIndex], block, fBlockSize); - TRACE("group [%ld]: inode table %lld\n", index, ((ext2_block_group*) - (fGroupBlocks[blockIndex] + blockOffset + TRACE("group [%" B_PRId32 "]: inode table %" B_PRIu64 "\n", index, + ((ext2_block_group*)(fGroupBlocks[blockIndex] + blockOffset * fGroupDescriptorSize))->InodeTable(Has64bitFeature())); } @@ -646,9 +650,9 @@ Volume::WriteBlockGroup(Transaction& transaction, int32 index) + blockOffset * fGroupDescriptorSize); group->checksum = _GroupCheckSum(group, index); - TRACE("Volume::WriteBlockGroup() checksum 0x%x for group %ld " - "(free inodes %ld, unused %ld)\n", group->checksum, index, - group->FreeInodes(Has64bitFeature()), + TRACE("Volume::WriteBlockGroup() checksum 0x%x for group %" B_PRId32 " " + "(free inodes %" B_PRIu32 ", unused %" B_PRIu32 ")\n", group->checksum, + index, group->FreeInodes(Has64bitFeature()), group->UnusedInodes(Has64bitFeature())); CachedBlock cached(this); @@ -822,7 +826,8 @@ Volume::AllocateBlocks(Transaction& transaction, uint32 minimum, uint32 maximum, if (status != B_OK) return status; - TRACE("Volume::AllocateBlocks(): Allocated %lu blocks\n", length); + TRACE("Volume::AllocateBlocks(): Allocated %" B_PRIu32 " blocks\n", + length); fFreeBlocks -= length; @@ -833,7 +838,7 @@ Volume::AllocateBlocks(Transaction& transaction, uint32 minimum, uint32 maximum, status_t Volume::FreeBlocks(Transaction& transaction, fsblock_t start, uint32 length) { - TRACE("Volume::FreeBlocks(%llu, %lu)\n", start, length); + TRACE("Volume::FreeBlocks(%" B_PRIu64 ", %" B_PRIu32 ")\n", start, length); if (IsReadOnly()) return B_READ_ONLY_DEVICE; @@ -841,11 +846,11 @@ Volume::FreeBlocks(Transaction& transaction, fsblock_t start, uint32 length) if (status != B_OK) return status; - TRACE("Volume::FreeBlocks(): number of free blocks (before): %llu\n", - fFreeBlocks); + TRACE("Volume::FreeBlocks(): number of free blocks (before): %" B_PRIdOFF + "\n", fFreeBlocks); fFreeBlocks += length; - TRACE("Volume::FreeBlocks(): number of free blocks (after): %llu\n", - fFreeBlocks); + TRACE("Volume::FreeBlocks(): number of free blocks (after): %" B_PRIdOFF + "\n", fFreeBlocks); return WriteSuperBlock(transaction); } @@ -880,8 +885,9 @@ Volume::WriteSuperBlock(Transaction& transaction) fSuperBlock.SetFreeInodes(fFreeInodes); // TODO: Rest of fields that can be modified - TRACE("Volume::WriteSuperBlock(): free blocks: %llu, free inodes: %lu\n", - fSuperBlock.FreeBlocks(Has64bitFeature()), fSuperBlock.FreeInodes()); + TRACE("Volume::WriteSuperBlock(): free blocks: %" B_PRIu64 ", free inodes:" + " %" B_PRIu32 "\n", fSuperBlock.FreeBlocks(Has64bitFeature()), + fSuperBlock.FreeInodes()); CachedBlock cached(this); uint8* block = cached.SetToWritable(transaction, fFirstDataBlock); @@ -889,8 +895,8 @@ Volume::WriteSuperBlock(Transaction& transaction) if (block == NULL) return B_IO_ERROR; - TRACE("Volume::WriteSuperBlock(): first data block: %lu, block: %p, " - "superblock: %p\n", fFirstDataBlock, block, &fSuperBlock); + TRACE("Volume::WriteSuperBlock(): first data block: %" B_PRIu32 ", block:" + " %p, superblock: %p\n", fFirstDataBlock, block, &fSuperBlock); if (fFirstDataBlock == 0) memcpy(block + 1024, &fSuperBlock, sizeof(fSuperBlock)); diff --git a/src/add-ons/kernel/file_systems/ext2/ext2.h b/src/add-ons/kernel/file_systems/ext2/ext2.h index 25a8468e1a..b966e7c72d 100644 --- a/src/add-ons/kernel/file_systems/ext2/ext2.h +++ b/src/add-ons/kernel/file_systems/ext2/ext2.h @@ -13,9 +13,6 @@ #include -//#define TRACE_EXT2 - - typedef uint64 fileblock_t; // file block number typedef uint64 fsblock_t; // filesystem block number diff --git a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp index b5fcdfce23..daea2ec47f 100644 --- a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp @@ -217,7 +217,7 @@ ext2_get_vnode(fs_volume* _volume, ino_t id, fs_vnode* _node, int* _type, Volume* volume = (Volume*)_volume->private_volume; if (id < 2 || id > volume->NumInodes()) { - ERROR("invalid inode id %lld requested!\n", id); + ERROR("invalid inode id %" B_PRIdINO " requested!\n", id); return B_BAD_VALUE; } @@ -319,7 +319,7 @@ ext2_read_pages(fs_volume* _volume, fs_vnode* _node, void* _cookie, while (true) { file_io_vec fileVecs[8]; - uint32 fileVecCount = 8; + size_t fileVecCount = 8; status = file_map_translate(inode->Map(), pos, bytesLeft, fileVecs, &fileVecCount, 0); @@ -436,8 +436,8 @@ ext2_get_file_map(fs_volume* _volume, fs_vnode* _node, off_t offset, return status; if (block > volume->NumBlocks()) { - panic("ext2_get_file_map() found block %lld for offset %lld\n", - block, offset); + panic("ext2_get_file_map() found block %" B_PRIu64 " for offset %" + B_PRIdOFF "\n", block, offset); } off_t blockOffset = block << volume->BlockShift(); @@ -467,10 +467,10 @@ ext2_get_file_map(fs_volume* _volume, fs_vnode* _node, off_t offset, offset += blockLength; size -= blockLength; - if (size <= vecs[index - 1].length || offset >= inode->Size()) { + if ((off_t)size <= vecs[index - 1].length || offset >= inode->Size()) { // We're done! *_count = index; - TRACE("ext2_get_file_map for inode %lld\n", inode->ID()); + TRACE("ext2_get_file_map for inode %" B_PRIdINO "\n", inode->ID()); return B_OK; } } @@ -518,7 +518,7 @@ static status_t ext2_ioctl(fs_volume* _volume, fs_vnode* _node, void* _cookie, uint32 cmd, void* buffer, size_t bufferLength) { - TRACE("ioctl: %lu\n", cmd); + TRACE("ioctl: %" B_PRIu32 "\n", cmd); Volume* volume = (Volume*)_volume->private_volume; switch (cmd) { @@ -537,14 +537,15 @@ ext2_ioctl(fs_volume* _volume, fs_vnode* _node, void* _cookie, uint32 cmd, uint32 group = 0; uint32 length; - TRACE("ioctl: blocks per group: %lu, block size: %lu, " - "first block: %lu, start: %llu, group: %lu\n", blocksPerGroup, + TRACE("ioctl: blocks per group: %" B_PRIu32 ", block size: %" + B_PRIu32 ", first block: %" B_PRIu32 ", start: %" B_PRIu64 + ", group: %" B_PRIu32 "\n", blocksPerGroup, blockSize, firstBlock, start, group); while (volume->AllocateBlocks(transaction, 1, 2048, group, start, length) == B_OK) { - TRACE("ioctl: Allocated blocks in group %lu: %llu-%llu\n", group, - start, start + length); + TRACE("ioctl: Allocated blocks in group %" B_PRIu32 ": %" + B_PRIu64 "-%" B_PRIu64 "\n", group, start, start + length); off_t blockNum = start + group * blocksPerGroup - firstBlock; for (uint32 i = 0; i < length; ++i) { @@ -1072,8 +1073,8 @@ ext2_rename(fs_volume* _volume, fs_vnode* _oldDir, const char* oldName, status = inodeIterator.FindEntry(".."); if (status == B_ENTRY_NOT_FOUND) { - TRACE("Corrupt file sytem. Missing \"..\" in directory %ld\n", - (int32)inode->ID()); + TRACE("Corrupt file system. Missing \"..\" in directory %" + B_PRIdINO "\n", inode->ID()); return B_BAD_DATA; } else if (status != B_OK) return status; @@ -1266,7 +1267,7 @@ ext2_read_link(fs_volume *_volume, fs_vnode *_node, char *buffer, if (!inode->IsSymLink()) return B_BAD_VALUE; - if (inode->Size() < *_bufferSize) + if (inode->Size() < (off_t)*_bufferSize) *_bufferSize = inode->Size(); if (inode->Size() > EXT2_SHORT_SYMLINK_LENGTH) From a61d468cf92c71160a57130ca96522d24cab962c Mon Sep 17 00:00:00 2001 From: John Scipione Date: Wed, 8 May 2013 13:51:32 -0400 Subject: [PATCH 054/136] BMenuItem: Round to prevent unneeded truncation The case I fear is if frameWidth is 99.999999 and labelWidth is 100.0 it will attempt to perform a truncation unnecessarily. --- src/kits/interface/MenuItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kits/interface/MenuItem.cpp b/src/kits/interface/MenuItem.cpp index c27645e336..4e5691b2ab 100644 --- a/src/kits/interface/MenuItem.cpp +++ b/src/kits/interface/MenuItem.cpp @@ -408,7 +408,7 @@ BMenuItem::DrawContent() const BRect& padding = menuPrivate.Padding(); float frameWidth = fSuper->Frame().Width() - padding.left - padding.right; - if (frameWidth >= labelWidth) + if (roundf(frameWidth) >= roundf(labelWidth)) fSuper->DrawString(fLabel); else { // truncate label to fit From ec1f08fb05e916c96194f62ff15f129b2ad66124 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Wed, 8 May 2013 13:55:58 -0400 Subject: [PATCH 055/136] Resize menu field menu bar iff fFixedSize is true If the menu field is not fixed size than the width of the menu bar should depend on the menu item contents so just do the default and get the Bounds() without any extra resizing. --- src/kits/interface/BMCPrivate.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index 79847f1b57..6dc16759fd 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -137,13 +137,14 @@ _BMCMenuBar_::AttachedToWindow() void _BMCMenuBar_::Draw(BRect updateRect) { - float height; - GetPreferredSize(NULL, &height); - ResizeTo(fMenuField->_MenuBarWidth(), height); - // Set the width to the menu field width because the menubar - // bounds are expanded by the selected menu item. + if (fFixedSize) { + float height; + GetPreferredSize(NULL, &height); + ResizeTo(fMenuField->_MenuBarWidth(), height); + // Set the width to the menu field width because the menubar + // bounds are expanded by the selected menu item. + } BRect rect(Bounds()); - rgb_color base = ui_color(B_MENU_BACKGROUND_COLOR); uint32 flags = 0; if (!IsEnabled()) From 879020baf11d142a48ba1714fcca1c419b93a4c3 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Wed, 8 May 2013 14:05:55 -0400 Subject: [PATCH 056/136] Info: Set fixed size true for pref app menu field Fixes #9753 This changes the preferred app menu field to no longer resize itself based on the item width and instead always take up the rest of the available space in the window. For narrower items this means that there will be empty space to the right where there wasn't before. For items wider than the available width of the window (like the example in #9753) this means that the item will be truncated when selected. AFAIK this was always a problem and was not caused by my recent work on menu fields, we just didn't notice it because it's rare that an application name in English at the default 12pt font size is wider than the available space. That being said, this fix is a band aid, the real fix is to convert this window to use the layout APIs so that if you have an application that is too wide to fit then the window will resize itself to fit the new item. There are other some layout problems in this window too. Unfortunately, like Find, this window has not been updated in aldeck's Tracker layout branch. Luckily, converting this window to use the layout API is a lot less work than Find was. --- src/kits/tracker/InfoWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kits/tracker/InfoWindow.cpp b/src/kits/tracker/InfoWindow.cpp index f07c50342a..9b09b0b369 100644 --- a/src/kits/tracker/InfoWindow.cpp +++ b/src/kits/tracker/InfoWindow.cpp @@ -921,7 +921,7 @@ AttributeView::AttributeView(BRect rect, Model* model) fTitleRect.bottom + (lineHeight * 7), Bounds().Width() - 5, fTitleRect.bottom + (lineHeight * 8)); fPreferredAppMenu = new BMenuField(preferredAppRect, "", "", - new BPopUpMenu("")); + new BPopUpMenu(""), true); fDivider = currentFont.StringWidth(B_TRANSLATE("Opens with:")) + 5; fPreferredAppMenu->SetDivider(fDivider); From a69facf0517bfcea02258dcc0e17a037158938a1 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Wed, 8 May 2013 23:24:12 -0400 Subject: [PATCH 057/136] Implement #9756. ImageFunctionsView now builds... ...a source path-based tree of all the image's functions, and consequently organizes them into a nested hierarchy similar to the on-disk directory structure in which they were originally found (or at least, as close as we can get from the DWARF info). --- .../gui/team_window/ImageFunctionsView.cpp | 421 +++++++++++++----- .../gui/team_window/ImageFunctionsView.h | 2 + 2 files changed, 305 insertions(+), 118 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp index 3a096fa7a0..06eb89d0de 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp @@ -1,6 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. - * Copyright 2011, Rene Gollent, rene@gollent.com. + * Copyright 2011-2013, Rene Gollent, rene@gollent.com. * Distributed under the terms of the MIT License. */ @@ -23,6 +23,135 @@ #include "Tracing.h" +// #pragma mark - SourcePathComponentNode + + +class ImageFunctionsView::SourcePathComponentNode : public BReferenceable { +public: + SourcePathComponentNode(SourcePathComponentNode* parent, + const BString& componentName, LocatableFile* sourceFile, + FunctionInstance* function) + : + fParent(parent), + fComponentName(componentName), + fSourceFile(sourceFile), + fFunction(function) + { + if (fParent != NULL) + fParent->AcquireReference(); + if (fSourceFile != NULL) + fSourceFile->AcquireReference(); + if (fFunction != NULL) + fFunction->AcquireReference(); + } + + virtual ~SourcePathComponentNode() + { + for (int32 i = 0; i < fChildPathComponents.CountItems(); i++) + fChildPathComponents.ItemAt(i)->ReleaseReference(); + + if (fParent != NULL) + fParent->ReleaseReference(); + + if (fSourceFile != NULL) + fSourceFile->ReleaseReference(); + + if (fFunction != NULL) + fFunction->AcquireReference(); + } + + const BString& ComponentName() const + { + return fComponentName; + } + + LocatableFile* SourceFile() const + { + return fSourceFile; + } + + FunctionInstance* Function() const + { + return fFunction; + } + + int32 CountChildren() const + { + return fChildPathComponents.CountItems(); + } + + SourcePathComponentNode* ChildAt(int32 index) + { + return fChildPathComponents.ItemAt(index); + } + + SourcePathComponentNode* FindChildByName(const BString& name) const + { + return fChildPathComponents.BinarySearchByKey(name, + &CompareByComponentName); + } + + int32 FindChildIndexByName(const BString& name) const + { + return fChildPathComponents.BinarySearchIndexByKey(name, + &CompareByComponentName); + } + + bool AddChild(SourcePathComponentNode* child) + { + if (!fChildPathComponents.BinaryInsert(child, + &CompareComponents)) { + return false; + } + + child->AcquireReference(); + + return true; + } + + bool RemoveChild(SourcePathComponentNode* child) + { + if (!fChildPathComponents.RemoveItem(child)) + return false; + + child->ReleaseReference(); + + return true; + } + + bool RemoveAllChildren() + { + for (int32 i = 0; i < fChildPathComponents.CountItems(); i++) + RemoveChild(fChildPathComponents.ItemAt(i)); + + return true; + } + +private: + static int CompareByComponentName(const BString* name, const + SourcePathComponentNode* node) + { + return name->Compare(node->ComponentName()); + } + + static int CompareComponents(const SourcePathComponentNode* a, + const SourcePathComponentNode* b) + { + return a->ComponentName().Compare(b->ComponentName()); + } + +private: + typedef BObjectList ChildPathComponentList; + +private: + SourcePathComponentNode* fParent; + BString fComponentName; + LocatableFile* fSourceFile; + FunctionInstance* fFunction; + ChildPathComponentList fChildPathComponents; +}; + + // #pragma mark - FunctionsTableModel @@ -31,10 +160,7 @@ public: FunctionsTableModel() : fImageDebugInfo(NULL), - fFunctions(NULL), - fFunctionCount(0), - fSourceFileIndices(NULL), - fSourceFileCount(0) + fSourcelessNode(NULL) { } @@ -46,16 +172,14 @@ public: void SetImageDebugInfo(ImageDebugInfo* imageDebugInfo) { // unset old functions - if (fSourceFileIndices != NULL) { - NotifyNodesRemoved(TreeTablePath(), 0, fSourceFileCount); + if (fImageDebugInfo != NULL) { + NotifyNodesRemoved(TreeTablePath(), 0, + fChildPathComponents.CountItems()); + for (int32 i = 0; i < fChildPathComponents.CountItems(); i++) + fChildPathComponents.ItemAt(i)->ReleaseReference(); - delete[] fFunctions; - fFunctions = NULL; - fFunctionCount = 0; - - delete[] fSourceFileIndices; - fSourceFileIndices = NULL; - fSourceFileCount = 0; + fChildPathComponents.MakeEmpty(); + fSourcelessNode = NULL; } fImageDebugInfo = imageDebugInfo; @@ -95,35 +219,27 @@ public: // The array might now be too large, but we can live with that. } - // count the different source files - int32 sourceFileCount = 1; - for (int32 i = 1; i < functionCount; i++) { - if (_CompareSourceFileNames(functions[i - 1]->SourceFile(), - functions[i]->SourceFile()) != 0) { - sourceFileCount++; + SourcePathComponentNode* sourcelessNode = new(std::nothrow) + SourcePathComponentNode(NULL, "", NULL, NULL); + ObjectDeleter sourceNodeDeleter( + sourcelessNode); + + + for (int32 i = 0; i < functionCount; i++) { + if (!_BuildFunctionSourcePath(functions[i], sourcelessNode)) + return; + } + + if (sourcelessNode->CountChildren() != 0) { + if (fChildPathComponents.BinaryInsert(sourcelessNode, + &SourcePathComponentNode::CompareComponents)) { + fSourcelessNode = sourcelessNode; + sourceNodeDeleter.Detach(); } } - // allocate and init the indices for the source files - fSourceFileIndices = new(std::nothrow) int32[sourceFileCount]; - if (fSourceFileIndices == NULL) - return; - fSourceFileCount = sourceFileCount; - - fSourceFileIndices[0] = 0; - - int32 sourceFileIndex = 1; - for (int32 i = 1; i < functionCount; i++) { - if (_CompareSourceFileNames(functions[i - 1]->SourceFile(), - functions[i]->SourceFile()) != 0) { - fSourceFileIndices[sourceFileIndex++] = i; - } - } - - fFunctions = functionsDeleter.Detach(); - fFunctionCount = functionCount; - - NotifyNodesAdded(TreeTablePath(), 0, fSourceFileCount); + NotifyNodesAdded(TreeTablePath(), 0, + fChildPathComponents.CountItems()); } virtual int32 CountColumns() const @@ -139,34 +255,17 @@ public: virtual int32 CountChildren(void* parent) const { if (parent == this) - return fSourceFileCount; + return fChildPathComponents.CountItems(); - if (parent >= fSourceFileIndices - && parent < fSourceFileIndices + fSourceFileCount) { - int32 sourceIndex = (int32*)parent - fSourceFileIndices; - return _CountSourceFileFunctions(sourceIndex); - } - - return 0; + return ((SourcePathComponentNode*)parent)->CountChildren(); } virtual void* ChildAt(void* parent, int32 index) const { - if (parent == this) { - return index >= 0 && index < fSourceFileCount - ? fSourceFileIndices + index : NULL; - } + if (parent == this) + return fChildPathComponents.ItemAt(index); - if (parent >= fSourceFileIndices - && parent < fSourceFileIndices + fSourceFileCount) { - int32 sourceIndex = (int32*)parent - fSourceFileIndices; - int32 count = _CountSourceFileFunctions(sourceIndex); - int32 firstFunctionIndex = fSourceFileIndices[sourceIndex]; - return index >= 0 && index < count - ? fFunctions[firstFunctionIndex + index] : NULL; - } - - return NULL; + return ((SourcePathComponentNode*)parent)->ChildAt(index); } virtual bool GetValueAt(void* object, int32 columnIndex, BVariant& value) @@ -177,84 +276,168 @@ public: if (object == this) return false; - if (object >= fSourceFileIndices - && object < fSourceFileIndices + fSourceFileCount) { - int32 index = *(int32*)object; - if (LocatableFile* file = fFunctions[index]->SourceFile()) { - BString path; - file->GetPath(path); - value.SetTo(path); - } else - value.SetTo("", B_VARIANT_DONT_COPY_DATA); + SourcePathComponentNode* node = (SourcePathComponentNode*)object; - return true; - } + value.SetTo(node->ComponentName(), B_VARIANT_DONT_COPY_DATA); - FunctionInstance* function = (FunctionInstance*)object; - value.SetTo(function->PrettyName(), B_VARIANT_DONT_COPY_DATA); return true; } bool GetFunctionPath(FunctionInstance* function, TreeTablePath& _path) { - int32 index = -1; - for (int32 i = 0; i < fFunctionCount; i++) { - if (fFunctions[i] == function) { - index = i; - break; + if (function == NULL) + return false; + + LocatableFile* sourceFile = function->SourceFile(); + SourcePathComponentNode* node = NULL; + int32 childIndex = -1; + if (sourceFile == NULL) { + node = fSourcelessNode; + _path.AddComponent(fChildPathComponents.IndexOf(node)); + } else { + BString sourcePath; + sourceFile->GetPath(sourcePath); + + if (sourcePath.IsEmpty()) + return false; + + BString searchPath; + while (!sourcePath.IsEmpty()) { + if (sourcePath[0] == '/') + sourcePath.Remove(0, 1); + int32 separatorIndex = sourcePath.FindFirst('/'); + if (separatorIndex == -1) { + searchPath = sourcePath; + sourcePath.Truncate(0); + } else + sourcePath.MoveInto(searchPath, 0, separatorIndex); + + if (node == NULL) { + childIndex = fChildPathComponents.BinarySearchIndexByKey( + searchPath, + &SourcePathComponentNode::CompareByComponentName); + node = fChildPathComponents.ItemAt(childIndex); + } else { + childIndex = node->FindChildIndexByName(searchPath); + node = node->ChildAt(childIndex); + } + + if (childIndex < 0) + return false; + + _path.AddComponent(childIndex); } } - if (index < 0) + if (node == NULL) return false; - int32 sourceIndex = fSourceFileCount - 1; - while (fSourceFileIndices[sourceIndex] > index) - sourceIndex--; + childIndex = node->FindChildIndexByName(function->PrettyName()); + if (childIndex < 0) + return false; - _path.Clear(); - return _path.AddComponent(sourceIndex) - && _path.AddComponent(index - fSourceFileIndices[sourceIndex]); + _path.AddComponent(childIndex); + return true; } bool GetObjectForPath(const TreeTablePath& path, LocatableFile*& _sourceFile, FunctionInstance*& _function) { - int32 componentCount = path.CountComponents(); - if (componentCount == 0 || componentCount > 2) + SourcePathComponentNode* node = fChildPathComponents.ItemAt( + path.ComponentAt(0)); + + if (node == NULL) return false; - int32 sourceIndex = path.ComponentAt(0); - if (sourceIndex < 0 || sourceIndex >= fSourceFileCount) - return false; + for (int32 i = 1; i < path.CountComponents(); i++) + node = node->ChildAt(path.ComponentAt(i)); - _sourceFile = fFunctions[fSourceFileIndices[sourceIndex]]->SourceFile(); - - _function = NULL; - - if (componentCount == 2) { - int32 index = path.ComponentAt(1); - if (index >= 0 && index < _CountSourceFileFunctions(sourceIndex)) - _function = fFunctions[fSourceFileIndices[sourceIndex] + index]; + if (node != NULL) { + _sourceFile = node->SourceFile(); + _function = node->Function(); + return true; } - return true; - } - - int32 CountSourceFiles() const - { - return fSourceFileCount; + return false; } private: - int32 _CountSourceFileFunctions(int32 sourceIndex) const + bool _BuildFunctionSourcePath(FunctionInstance* function, + SourcePathComponentNode* sourcelessNode) { - if (sourceIndex < 0 || sourceIndex >= fSourceFileCount) - return 0; + LocatableFile* sourceFile = function->SourceFile(); + if (sourceFile == NULL) + return _AddFunctionNode(sourcelessNode, function, NULL); - int32 nextFunctionIndex = sourceIndex + 1 < fSourceFileCount - ? fSourceFileIndices[sourceIndex + 1] : fFunctionCount; - return nextFunctionIndex - fSourceFileIndices[sourceIndex]; + BString sourcePath; + sourceFile->GetPath(sourcePath); + if (sourcePath.IsEmpty()) + return false; + + return _AddNextPathComponent(NULL, sourcePath, function, sourceFile); + } + + bool _AddNextPathComponent(SourcePathComponentNode* parent, + BString& childPath, FunctionInstance* function, LocatableFile* file) + { + if (childPath[0] == '/') + childPath.Remove(0, 1); + + BString pathComponent; + int32 pathSeparatorIndex = childPath.FindFirst('/'); + if (pathSeparatorIndex == -1) + pathComponent = childPath; + else + childPath.MoveInto(pathComponent, 0, pathSeparatorIndex); + + SourcePathComponentNode* currentNode = NULL; + if (parent == NULL) { + currentNode = fChildPathComponents.BinarySearchByKey(pathComponent, + SourcePathComponentNode::CompareByComponentName); + } else + currentNode = parent->FindChildByName(pathComponent); + + if (currentNode == NULL) { + currentNode = new(std::nothrow) SourcePathComponentNode(parent, + pathComponent, NULL, NULL); + if (currentNode == NULL) + return false; + ObjectDeleter nodeDeleter(currentNode); + if (parent != NULL) { + if (!parent->AddChild(currentNode)) + return false; + } else { + if (!fChildPathComponents.BinaryInsert(currentNode, + &SourcePathComponentNode::CompareComponents)) { + return false; + } + } + nodeDeleter.Detach(); + } + + if (pathSeparatorIndex == -1) + return _AddFunctionNode(currentNode, function, file); + + return _AddNextPathComponent(currentNode, childPath, function, file); + } + + bool _AddFunctionNode(SourcePathComponentNode* parent, + FunctionInstance* function, LocatableFile* file) + { + SourcePathComponentNode* functionNode = new(std::nothrow) + SourcePathComponentNode(parent, function->PrettyName(), file, + function); + + if (functionNode == NULL) + return B_NO_MEMORY; + + ObjectDeleter nodeDeleter(functionNode); + + if (!parent->AddChild(functionNode)) + return false; + + nodeDeleter.Detach(); + return true; } static int _CompareSourceFileNames(LocatableFile* a, LocatableFile* b) @@ -290,11 +473,12 @@ private: } private: - ImageDebugInfo* fImageDebugInfo; - FunctionInstance** fFunctions; - int32 fFunctionCount; - int32* fSourceFileIndices; - int32 fSourceFileCount; + typedef BObjectList ChildPathComponentList; + +private: + ImageDebugInfo* fImageDebugInfo; + ChildPathComponentList fChildPathComponents; + SourcePathComponentNode* fSourcelessNode; }; @@ -364,7 +548,7 @@ ImageFunctionsView::SetImageDebugInfo(ImageDebugInfo* imageDebugInfo) // If there's only one source file (i.e. "no source file"), expand the item. if (fImageDebugInfo != NULL - && fFunctionsTableModel->CountSourceFiles() == 1) { + && fFunctionsTableModel->CountChildren(fFunctionsTableModel) == 1) { TreeTablePath path; path.AddComponent(0); fFunctionsTable->SetNodeExpanded(path, true, false); @@ -388,6 +572,7 @@ ImageFunctionsView::SetFunction(FunctionInstance* function) fFunctionsTable->SetNodeExpanded(path, true, true); fFunctionsTable->SelectNode(path, false); fFunctionsTable->ScrollToNode(path); + fFunctionsTable->ResizeAllColumnsToPreferred(); } else fFunctionsTable->DeselectAllNodes(); } diff --git a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.h b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.h index eb4ed2674e..55fb9594ac 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.h +++ b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.h @@ -1,5 +1,6 @@ /* * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2013, Rene Gollent, rene@gollent.com. * Distributed under the terms of the MIT License. */ #ifndef IMAGE_FUNCTIONS_VIEW_H @@ -36,6 +37,7 @@ public: private: class FunctionsTableModel; + class SourcePathComponentNode; private: // TreeTableListener From e1fff3ea3a3c8ebc43b6c0028dd8903eed77e3d5 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Thu, 9 May 2013 07:24:13 -0400 Subject: [PATCH 058/136] Build fix. --- .../user_interface/gui/team_window/ImageFunctionsView.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp index 06eb89d0de..f3088689c4 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp @@ -128,6 +128,8 @@ public: } private: + friend class ImageFunctionsView::FunctionsTableModel; + static int CompareByComponentName(const BString* name, const SourcePathComponentNode* node) { From 5a58ea80cf356b39eb19355a42e378ce9074cd6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 15:08:11 +0200 Subject: [PATCH 059/136] nfs: fixes 64 bit warnings --- .../kernel/file_systems/nfs/nfs_add_on.c | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c b/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c index 1341e37381..eab631ca2d 100644 --- a/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c +++ b/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c @@ -229,7 +229,8 @@ postoffice_func(fs_nspace *ns) while (release_sem (call->sem) == B_INTERRUPTED); } else { - dprintf("nfs: postoffice: can't find pending call to remove for xid %ld\n", xid); + dprintf("nfs: postoffice: can't find pending call to remove " + "for xid %" B_PRId32 "\n", xid); } } } @@ -324,7 +325,7 @@ send_rpc_call(fs_nspace *ns, const struct sockaddr_in *addr, int32 prog, call = RPCPendingCallsFindAndRemovePendingCall(&ns->pendingCalls, xid, addr); - dprintf("nfs: xid %ld timed out, removing from queue", xid); + dprintf("nfs: xid %" B_PRId32 " timed out, removing from queue", xid); #if 0 if (call==NULL) @@ -375,14 +376,15 @@ is_successful_reply(struct XDRInPacket *reply) rpc_reject_stat rejectStat = (rpc_reject_stat)XDRInPacketGetInt32(reply); if (rejectStat == RPC_RPC_MISMATCH) { - int32 low=XDRInPacketGetInt32(reply); - int32 high=XDRInPacketGetInt32(reply); + int32 low = XDRInPacketGetInt32(reply); + int32 high = XDRInPacketGetInt32(reply); - dprintf ("nfs: RPC_MISMATCH (%ld,%ld)", low, high); + dprintf("nfs: RPC_MISMATCH (%" B_PRId32 ",%" B_PRId32 ")", low, + high); } else { rpc_auth_stat authStat = (rpc_auth_stat)XDRInPacketGetInt32(reply); - dprintf ("nfs: RPC_AUTH_ERROR (%d)", authStat); + dprintf("nfs: RPC_AUTH_ERROR (%d)", authStat); } } else { rpc_auth_flavor flavor = (rpc_auth_flavor)XDRInPacketGetInt32(reply); @@ -397,9 +399,10 @@ is_successful_reply(struct XDRInPacket *reply) int32 low = XDRInPacketGetInt32(reply); int32 high = XDRInPacketGetInt32(reply); - dprintf ("nfs: RPC_PROG_MISMATCH (%ld,%ld)", low, high); + dprintf("nfs: RPC_PROG_MISMATCH (%" B_PRId32 ",%" B_PRId32 ")", + low, high); } else if (acceptStat != RPC_SUCCESS) - dprintf ("nfs: Accepted but failed (%d)", acceptStat); + dprintf("nfs: Accepted but failed (%d)", acceptStat); else success = true; } @@ -1217,7 +1220,8 @@ fs_mount(fs_volume *_vol, const char *devname, uint32 flags, const char *_parms, if (_parms == NULL) return EINVAL; - dprintf("nfs: mount(%ld, %s, %08lx)\n", _vol->id, devname, flags); + dprintf("nfs: mount(%" B_PRId32 ", %s, %08" B_PRIx32 ")\n", _vol->id, + devname, flags); dprintf("nfs: nfs_params: %s\n", _parms); // HAIKU: this should go to std_ops @@ -1244,18 +1248,18 @@ fs_mount(fs_volume *_vol, const char *devname, uint32 flags, const char *_parms, memset(ns->mountAddr.sin_zero, 0, sizeof(ns->mountAddr.sin_zero)); if ((result = create_socket(ns)) < B_OK) { - dprintf( "nfs: could not create socket (%d)\n", (int)result ); + dprintf("nfs: could not create socket (%" B_PRId32 ")\n", result); goto err_socket; } if ((result = init_postoffice(ns)) < B_OK) { - dprintf( "nfs: could not init_postoffice() (%d)\n", (int)result ); + dprintf("nfs: could not init_postoffice() (%" B_PRId32 ")\n", result); goto err_postoffice; } if ((result = get_remote_address(ns, MOUNT_PROGRAM, MOUNT_VERSION, PMAP_IPPROTO_UDP, &ns->mountAddr)) < B_OK) { - dprintf( "could not get_remote_address() (%d)\n", (int)result ); + dprintf("could not get_remote_address() (%" B_PRId32 ")\n", result); goto err_sem; } From 7e5b0f964988b2b184d0bee6741d362a268c76d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 15:44:10 +0200 Subject: [PATCH 060/136] udf: fixes 64 bit warnings --- .../udf/AllocationDescriptorList.h | 5 +- src/add-ons/kernel/file_systems/udf/Icb.cpp | 63 ++++++++++--------- .../file_systems/udf/PhysicalPartition.cpp | 14 ++--- .../kernel/file_systems/udf/Recognition.cpp | 33 +++++----- .../file_systems/udf/SparablePartition.cpp | 5 +- .../kernel/file_systems/udf/UdfString.cpp | 16 ++--- .../kernel/file_systems/udf/UdfString.h | 3 +- src/add-ons/kernel/file_systems/udf/Utils.cpp | 12 ++-- .../kernel/file_systems/udf/Volume.cpp | 43 +++++++------ .../file_systems/udf/kernel_interface.cpp | 4 +- 10 files changed, 108 insertions(+), 90 deletions(-) diff --git a/src/add-ons/kernel/file_systems/udf/AllocationDescriptorList.h b/src/add-ons/kernel/file_systems/udf/AllocationDescriptorList.h index 3c3c8ff163..5a6b1d9d98 100644 --- a/src/add-ons/kernel/file_systems/udf/AllocationDescriptorList.h +++ b/src/add-ons/kernel/file_systems/udf/AllocationDescriptorList.h @@ -101,7 +101,7 @@ status_t AllocationDescriptorList::FindExtent(off_t start, long_address *extent, bool *isEmpty) { - TRACE(("AllocationDescriptorList<>::FindExtent: start: %Ld, " + TRACE(("AllocationDescriptorList<>::FindExtent: start: %" B_PRIdOFF ", " "extent: %p, isEmpty: %p\n", start, extent, isEmpty)); off_t startBlock = start >> fVolume->BlockShift(); @@ -132,7 +132,8 @@ AllocationDescriptorList::FindExtent(off_t start, } } else { TRACE_ERROR(("AllocationDescriptorList<>::FindExtent: " - "Descriptor #%ld found NULL\n", _DescriptorNumber())); + "Descriptor #%" B_PRId32 " found NULL\n", + _DescriptorNumber())); status = B_ERROR; break; } diff --git a/src/add-ons/kernel/file_systems/udf/Icb.cpp b/src/add-ons/kernel/file_systems/udf/Icb.cpp index 61a91357af..c924966e54 100644 --- a/src/add-ons/kernel/file_systems/udf/Icb.cpp +++ b/src/add-ons/kernel/file_systems/udf/Icb.cpp @@ -22,9 +22,9 @@ DirectoryIterator::GetNextEntry(char *name, uint32 *length, ino_t *id) if (!id || !name || !length) return B_BAD_VALUE; - TRACE(("DirectoryIterator::GetNextEntry: name = %p, length = %ld, " - "id = %p, position = %Ld, parent length = %Ld\n", name, *length, id, - fPosition, Parent()->Length())); + TRACE(("DirectoryIterator::GetNextEntry: name = %p, length = %" B_PRIu32 + ", id = %p, position = %" B_PRIdOFF ", parent length = %" B_PRIu64 + "\n", name, *length, id, fPosition, Parent()->Length())); status_t status = B_OK; if (fAtBeginning) { @@ -62,7 +62,8 @@ DirectoryIterator::GetNextEntry(char *name, uint32 *length, ino_t *id) } else { UdfString string(entry->id(), entry->id_length()); TRACE(("DirectoryIterator::GetNextEntry: UfdString id == `%s', " - "length = %lu\n", string.Utf8(), string.Utf8Length())); + "length = %" B_PRIu32 "\n", string.Utf8(), + string.Utf8Length())); DUMP(entry->icb()); sprintf(name, "%s", string.Utf8()); *length = string.Utf8Length(); @@ -111,9 +112,9 @@ Icb::Icb(Volume *volume, long_address address) fFileCache(NULL), fFileMap(NULL) { - TRACE(("Icb::Icb: volume = %p, address(block = %ld, partition = %d, " - "length = %ld)\n", volume, address.block(), address.partition(), - address.length())); + TRACE(("Icb::Icb: volume = %p, address(block = %" B_PRIu32 ", partition = " + "%d, length = %" B_PRIu32 ")\n", volume, address.block(), + address.partition(), address.length())); if (volume == NULL) fInitStatus = B_BAD_VALUE; @@ -142,7 +143,8 @@ Icb::Icb(Volume *volume, long_address address) } fInitStatus = status; - TRACE(("Icb::Icb: status = 0x%lx, `%s'\n", status, strerror(status))); + TRACE(("Icb::Icb: status = 0x%" B_PRIx32 ", `%s'\n", status, + strerror(status))); } @@ -222,7 +224,7 @@ Icb::FindBlock(uint32 logicalBlock, off_t &block, bool &recorded) return B_ERROR; } - DEBUG_INIT_ETC("Icb", ("pos: %lld", pos)); + DEBUG_INIT_ETC("Icb", ("pos: %" B_PRIdOFF, pos)); status_t status = B_OK; long_address extent; @@ -237,8 +239,9 @@ Icb::FindBlock(uint32 logicalBlock, off_t &block, bool &recorded) ShortDescriptorAccessor(fPartition)); status = list.FindExtent(pos, &extent, &isEmpty); if (status != B_OK) { - TRACE_ERROR(("Icb::FindBlock: error finding extent for offset %Ld. " - "status = 0x%lx `%s'\n", pos, status, strerror(status))); + TRACE_ERROR(("Icb::FindBlock: error finding extent for offset " + "%" B_PRIdOFF ". status = 0x%" B_PRIx32 " `%s'\n", pos, status, + strerror(status))); } break; } @@ -249,8 +252,9 @@ Icb::FindBlock(uint32 logicalBlock, off_t &block, bool &recorded) AllocationDescriptorList list(this); status = list.FindExtent(pos, &extent, &isEmpty); if (status != B_OK) { - TRACE_ERROR(("Icb::FindBlock: error finding extent for offset %Ld. " - "status = 0x%lx `%s'\n", pos, status, strerror(status))); + TRACE_ERROR(("Icb::FindBlock: error finding extent for offset " + "%" B_PRIdOFF ". status = 0x%" B_PRIx32 " `%s'\n", pos, + status, strerror(status))); } break; } @@ -281,7 +285,7 @@ Icb::FindBlock(uint32 logicalBlock, off_t &block, bool &recorded) if (status == B_OK) { block = extent.block(); recorded = extent.type() == EXTENT_TYPE_RECORDED; - TRACE(("Icb::FindBlock: block %lld\n", block)); + TRACE(("Icb::FindBlock: block %" B_PRIdOFF "\n", block)); } return status; } @@ -290,7 +294,7 @@ Icb::FindBlock(uint32 logicalBlock, off_t &block, bool &recorded) status_t Icb::Read(off_t pos, void *buffer, size_t *length, uint32 *block) { - TRACE(("Icb::Read: pos = %Ld, buffer = %p, length = (%p)->%ld\n", + TRACE(("Icb::Read: pos = %" B_PRIdOFF ", buffer = %p, length = (%p)->%ld\n", pos, buffer, length, (length ? *length : 0))); if (!buffer || !length || pos < 0) @@ -356,8 +360,8 @@ template status_t Icb::_Read(DescriptorList &list, off_t pos, void *_buffer, size_t *length, uint32 *block) { - TRACE(("Icb::_Read(): list = %p, pos = %Ld, buffer = %p, length = %ld\n", - &list, pos, _buffer, (length ? *length : 0))); + TRACE(("Icb::_Read(): list = %p, pos = %" B_PRIdOFF ", buffer = %p, " + "length = %ld\n", &list, pos, _buffer, (length ? *length : 0))); uint64 bytesLeftInFile = uint64(pos) > Length() ? 0 : Length() - pos; size_t bytesLeft = (*length >= bytesLeftInFile) ? bytesLeftInFile : *length; @@ -370,19 +374,22 @@ Icb::_Read(DescriptorList &list, off_t pos, void *_buffer, size_t *length, uint3 while (bytesLeft > 0) { - TRACE(("Icb::_Read(): pos: %Ld, bytesLeft: %ld\n", pos, bytesLeft)); + TRACE(("Icb::_Read(): pos: %" B_PRIdOFF ", bytesLeft: %ld\n", pos, + bytesLeft)); long_address extent; bool isEmpty = false; status = list.FindExtent(pos, &extent, &isEmpty); if (status != B_OK) { - TRACE_ERROR(("Icb::_Read: error finding extent for offset %Ld. " - "status = 0x%lx `%s'\n", pos, status, strerror(status))); + TRACE_ERROR(("Icb::_Read: error finding extent for offset %" + B_PRIdOFF ". status = 0x%" B_PRIx32 " `%s'\n", pos, status, + strerror(status))); break; } - TRACE(("Icb::_Read(): found extent for offset %Ld: (block: %ld, " - "partition: %d, length: %ld, type: %d)\n", pos, extent.block(), - extent.partition(), extent.length(), extent.type())); + TRACE(("Icb::_Read(): found extent for offset %" B_PRIdOFF ": (block: " + "%" B_PRIu32 ", partition: %d, length: %" B_PRIu32 ", type: %d)\n", + pos, extent.block(), extent.partition(), extent.length(), + extent.type())); switch (extent.type()) { case EXTENT_TYPE_RECORDED: @@ -421,8 +428,8 @@ Icb::_Read(DescriptorList &list, off_t pos, void *_buffer, size_t *length, uint3 if (extent.length() < readLength) readLength = extent.length(); - TRACE(("Icb::_Read: reading block. offset = %Ld, length: %ld\n", - blockOffset, readLength)); + TRACE(("Icb::_Read: reading block. offset = %" B_PRIdOFF + ", length: %ld\n", blockOffset, readLength)); if (isEmpty) { TRACE(("Icb::_Read: reading %ld empty bytes as zeros\n", @@ -436,8 +443,8 @@ Icb::_Read(DescriptorList &list, off_t pos, void *_buffer, size_t *length, uint3 break; } - TRACE(("Icb::_Read: %ld bytes from disk block %Ld using " - "block_cache_get_etc()\n", readLength, diskBlock)); + TRACE(("Icb::_Read: %ld bytes from disk block %" B_PRIdOFF " using" + " block_cache_get_etc()\n", readLength, diskBlock)); uint8 *data = (uint8*)block_cache_get_etc(volume->BlockCache(), diskBlock, 0, readLength); if (data == NULL) @@ -530,7 +537,7 @@ Icb::_GetFileMap(DescriptorList &list, off_t offset, size_t size, size -= length; index++; - if (index >= max || size <= vecs[index - 1].length + if (index >= max || (off_t)size <= vecs[index - 1].length || offset >= (off_t)Length()) { *count = index; return index >= max ? B_BUFFER_OVERFLOW : B_OK; diff --git a/src/add-ons/kernel/file_systems/udf/PhysicalPartition.cpp b/src/add-ons/kernel/file_systems/udf/PhysicalPartition.cpp index 50a336237c..d118d3bf53 100644 --- a/src/add-ons/kernel/file_systems/udf/PhysicalPartition.cpp +++ b/src/add-ons/kernel/file_systems/udf/PhysicalPartition.cpp @@ -11,8 +11,8 @@ PhysicalPartition::PhysicalPartition(uint16 number, uint32 start, uint32 length) fStart(start), fLength(length) { - TRACE(("PhysicalPartition::PhysicalPartition: number = %d, start = %lu," - "length = %lu\n", number, start, length)); + TRACE(("PhysicalPartition::PhysicalPartition: number = %d, start = %" + B_PRIu32 ",length = %" B_PRIu32 "\n", number, start, length)); } @@ -31,15 +31,15 @@ PhysicalPartition::~PhysicalPartition() status_t PhysicalPartition::MapBlock(uint32 logicalBlock, off_t &physicalBlock) { - TRACE(("PhysicalPartition::MapBlock: %ld\n", logicalBlock)); + TRACE(("PhysicalPartition::MapBlock: %" B_PRIu32 "\n", logicalBlock)); if (logicalBlock >= fLength) { - TRACE_ERROR(("PhysicalPartition::MapBlock: block %ld invalid," - "length = %ld\n", logicalBlock, fLength)); + TRACE_ERROR(("PhysicalPartition::MapBlock: block %" B_PRIu32 " invalid" + ",length = %" B_PRIu32 "\n", logicalBlock, fLength)); return B_BAD_ADDRESS; } else { physicalBlock = fStart + logicalBlock; - TRACE(("PhysicalPartition::MapBlock: block %ld mapped to %Ld\n", - logicalBlock, physicalBlock)); + TRACE(("PhysicalPartition::MapBlock: block %" B_PRIu32 " mapped to %" + B_PRIdOFF "\n", logicalBlock, physicalBlock)); return B_OK; } } diff --git a/src/add-ons/kernel/file_systems/udf/Recognition.cpp b/src/add-ons/kernel/file_systems/udf/Recognition.cpp index fbc8a27ced..0cab1e07e8 100644 --- a/src/add-ons/kernel/file_systems/udf/Recognition.cpp +++ b/src/add-ons/kernel/file_systems/udf/Recognition.cpp @@ -54,23 +54,24 @@ udf_recognize(int device, off_t offset, off_t length, uint32 blockSize, partition_descriptor partitionDescriptors[], uint8 &partitionDescriptorCount) { - TRACE(("udf_recognize: device: = %d, offset = %Ld, length = %Ld, " - "blockSize = %ld, ", device, offset, length, blockSize)); - + TRACE(("udf_recognize: device: = %d, offset = %" B_PRIdOFF ", length = %" + B_PRIdOFF ", blockSize = %" B_PRIu32 "\n", device, offset, length, + blockSize)); // Check the block size status_t status = get_block_shift(blockSize, blockShift); if (status != B_OK) { TRACE_ERROR(("\nudf_recognize: Block size must be a positive power of " - "two! (blockSize = %ld)\n", blockSize)); + "two! (blockSize = %" B_PRIu32 ")\n", blockSize)); return status; } - TRACE(("blockShift: %ld\n", blockShift)); + TRACE(("blockShift: %" B_PRIu32 "\n", blockShift)); // Check for a valid volume recognition sequence status = walk_volume_recognition_sequence(device, offset, blockSize, blockShift); if (status != B_OK) { - TRACE_ERROR(("udf_recognize: Invalid sequence. status = %ld\n", status)); + TRACE_ERROR(("udf_recognize: Invalid sequence. status = %" B_PRId32 + "\n", status)); return status; } // Now hunt down a volume descriptor sequence from one of @@ -80,8 +81,8 @@ udf_recognize(int device, off_t offset, off_t length, uint32 blockSize, logicalVolumeDescriptor, partitionDescriptors, partitionDescriptorCount); if (status != B_OK) { - TRACE_ERROR(("udf_recognize: cannot find volume descriptor. status = %ld\n", - status)); + TRACE_ERROR(("udf_recognize: cannot find volume descriptor. status = %" + B_PRId32 "\n", status)); return status; } // Now walk the integrity sequence and make sure the last integrity @@ -90,7 +91,7 @@ udf_recognize(int device, off_t offset, off_t length, uint32 blockSize, logicalVolumeDescriptor.integrity_sequence_extent()); if (status != B_OK) { TRACE_ERROR(("udf_recognize: last integrity descriptor not closed. " - "status = %ld\n", status)); + "status = %" B_PRId32 "\n", status)); return status; } @@ -106,9 +107,9 @@ status_t walk_volume_recognition_sequence(int device, off_t offset, uint32 blockSize, uint32 blockShift) { - TRACE(("walk_volume_recognition_sequence: device = %d, offset = %Ld, " - "blockSize = %ld, blockShift = %lu\n", device, offset, blockSize, - blockShift)); + TRACE(("walk_volume_recognition_sequence: device = %d, offset = %" + B_PRIdOFF ", blockSize = %" B_PRIu32 ", blockShift = %" B_PRIu32 "\n", + device, offset, blockSize, blockShift)); // vrs starts at block 16. Each volume structure descriptor (vsd) // should be one block long. We're expecting to find 0 or more iso9660 @@ -125,8 +126,8 @@ walk_volume_recognition_sequence(int device, off_t offset, uint32 blockSize, bool foundECMA168 = false; for (uint32 block = 16; true; block++) { off_t address = (offset + block) << blockShift; - TRACE(("walk_volume_recognition_sequence: block = %ld, " - "address = %Ld, ", block, address)); + TRACE(("walk_volume_recognition_sequence: block = %" B_PRIu32 ", " + "address = %" B_PRIdOFF ", ", block, address)); ssize_t bytesRead = read_pos(device, address, chunk.Data(), blockSize); if (bytesRead == (ssize_t)blockSize) { volume_structure_descriptor_header* descriptor @@ -155,8 +156,8 @@ walk_volume_recognition_sequence(int device, off_t offset, uint32 blockSize, break; } } else { - TRACE_ERROR(("read_pos(pos:%Ld, len:%ld) failed with: 0x%lx\n", address, - blockSize, bytesRead)); + TRACE_ERROR(("read_pos(pos:%" B_PRIdOFF ", len:%" B_PRIu32 ") " + "failed with: 0x%lx\n", address, blockSize, bytesRead)); break; } } diff --git a/src/add-ons/kernel/file_systems/udf/SparablePartition.cpp b/src/add-ons/kernel/file_systems/udf/SparablePartition.cpp index 124e191d6e..480bbb498c 100644 --- a/src/add-ons/kernel/file_systems/udf/SparablePartition.cpp +++ b/src/add-ons/kernel/file_systems/udf/SparablePartition.cpp @@ -19,8 +19,9 @@ SparablePartition::SparablePartition(uint16 number, uint32 start, uint32 length, fTableCount(tableCount), fInitStatus(B_NO_INIT) { - TRACE(("SparablePartition::SparablePartition: number = %d, start = %lu," - "length = %lu, packetLength = %d\n", number, start, length, packetLength)); + TRACE(("SparablePartition::SparablePartition: number = %d, start = %" + B_PRIu32 ",length = %" B_PRIu32 ", packetLength = %d\n", number, start, + length, packetLength)); status_t status = (0 < TableCount() && TableCount() <= kMaxSparingTableCount) ? B_OK : B_BAD_VALUE; diff --git a/src/add-ons/kernel/file_systems/udf/UdfString.cpp b/src/add-ons/kernel/file_systems/udf/UdfString.cpp index 2e0eb472d9..b7eaa95c58 100644 --- a/src/add-ons/kernel/file_systems/udf/UdfString.cpp +++ b/src/add-ons/kernel/file_systems/udf/UdfString.cpp @@ -147,8 +147,8 @@ UdfString::SetTo(const char *utf8) // First copy the utf8 string fUtf8String = new(nothrow) char[length + 1]; if (fUtf8String == NULL) { - TRACE_ERROR(("UdfString::SetTo: fUtf8String[%ld] allocation failed\n", - length + 1)); + TRACE_ERROR(("UdfString::SetTo: fUtf8String[%" B_PRIu32 + "] allocation failed\n", length + 1)); return; } @@ -159,8 +159,8 @@ UdfString::SetTo(const char *utf8) // or have to use burly 16-bit unicode. uint32 *raw = new(nothrow) uint32[length]; if (raw == NULL) { - TRACE_ERROR(("UdfString::SetTo: uint32 raw[%ld] temporary string " - "allocation failed\n", length)); + TRACE_ERROR(("UdfString::SetTo: uint32 raw[%" B_PRIu32 "] temporary" + " string allocation failed\n", length)); _Clear(); return; } @@ -201,8 +201,8 @@ UdfString::SetTo(const char *utf8) for (uint32 i = 0; i < rawLength; i++) fCs0String[i + 1] = raw[i] % 256; } else { - TRACE_ERROR(("UdfString::SetTo: fCs0String[%ld] allocation failed\n", - fCs0Length)); + TRACE_ERROR(("UdfString::SetTo: fCs0String[%" B_PRIu32 + "] allocation failed\n", fCs0Length)); _Clear(); return; } @@ -221,8 +221,8 @@ UdfString::SetTo(const char *utf8) fCs0String[pos++] = low; } } else { - TRACE_ERROR(("UdfString::SetTo: fCs0String[%ld] allocation failed\n", - fCs0Length)); + TRACE_ERROR(("UdfString::SetTo: fCs0String[%" B_PRIu32 + "] allocation failed\n", fCs0Length)); _Clear(); return; } diff --git a/src/add-ons/kernel/file_systems/udf/UdfString.h b/src/add-ons/kernel/file_systems/udf/UdfString.h index 8db6127ddf..4d64fb36d1 100644 --- a/src/add-ons/kernel/file_systems/udf/UdfString.h +++ b/src/add-ons/kernel/file_systems/udf/UdfString.h @@ -61,7 +61,8 @@ UdfString::UdfString(const array &dString) : fCs0String(NULL) , fUtf8String(NULL) { - TRACE(("UdfString::UdfString: dString.length(): %ld", dString.length())); + TRACE(("UdfString::UdfString: dString.length(): %" B_PRIu32, + dString.length())); SetTo(dString); } diff --git a/src/add-ons/kernel/file_systems/udf/Utils.cpp b/src/add-ons/kernel/file_systems/udf/Utils.cpp index 111e41036d..f93aabe471 100644 --- a/src/add-ons/kernel/file_systems/udf/Utils.cpp +++ b/src/add-ons/kernel/file_systems/udf/Utils.cpp @@ -153,8 +153,8 @@ decode_time(timestamp ×tamp, struct timespec ×pec) long_address to_long_address(ino_t id, uint32 length) { - TRACE(("udf_to_long_address: ino_t = %Ld (0x%Lx), length = %ld", - id, id, length)); + TRACE(("udf_to_long_address: ino_t = %" B_PRIdINO ", length = %" B_PRIu32, + id, length)); long_address result; result.set_block((id >> 16) & 0xffffffff); result.set_partition(id & 0xffff); @@ -171,9 +171,11 @@ to_vnode_id(long_address address) ino_t result = address.block(); result <<= 16; result |= address.partition(); - TRACE(("block: %ld, 0x%lx\n", address.block(), address.block())); + TRACE(("block: %" B_PRIu32 ", 0x%" B_PRIx32 "\n", address.block(), + address.block())); TRACE(("partition: %d, 0x%x\n", address.partition(), address.partition())); - TRACE(("length: %ld, 0x%lx\n", address.length(), address.length())); - TRACE(("ino_t: %Ld, 0x%Lx\n", result, result)); + TRACE(("length: %" B_PRIu32 ", 0x%" B_PRIx32 "\n", address.length(), + address.length())); + TRACE(("ino_t: %" B_PRIdINO "\n", result)); return result; } diff --git a/src/add-ons/kernel/file_systems/udf/Volume.cpp b/src/add-ons/kernel/file_systems/udf/Volume.cpp index 87360165a2..7222003de2 100644 --- a/src/add-ons/kernel/file_systems/udf/Volume.cpp +++ b/src/add-ons/kernel/file_systems/udf/Volume.cpp @@ -48,9 +48,9 @@ status_t Volume::Mount(const char *deviceName, off_t offset, off_t length, uint32 blockSize, uint32 flags) { - TRACE(("Volume::Mount: deviceName = `%s', offset = %Ld, length = %Ld, " - "blockSize: %ld, flags: %ld\n", deviceName, offset, length, blockSize, - flags)); + TRACE(("Volume::Mount: deviceName = `%s', offset = %" B_PRIdOFF ", length " + "= %" B_PRIdOFF ", blockSize: %" B_PRIu32 ", flags: %" B_PRIu32 "\n", + deviceName, offset, length, blockSize, flags)); if (!deviceName) return B_BAD_VALUE; if (Mounted()) @@ -134,8 +134,9 @@ Volume::Mount(const char *deviceName, off_t offset, off_t length, status = partition ? B_OK : B_NO_MEMORY; if (!status) { TRACE(("Volume::Mount: adding PhysicalPartition(number: %d, " - "start: %ld, length: %ld)\n", map->partition_number(), - descriptor->start(), descriptor->length())); + "start: %" B_PRIu32 ", length: %" B_PRIu32 ")\n", + map->partition_number(), descriptor->start(), + descriptor->length())); status = _SetPartition(i, partition); if (!status) physicalCount++; @@ -197,7 +198,7 @@ Volume::Mount(const char *deviceName, off_t offset, off_t length, metadataCount++; } else { TRACE_ERROR(("Volume::Mount: metadata partition " - "creation failed! 0x%lx\n", status)); + "creation failed! 0x%" B_PRIx32 "\n", status)); } } else { TRACE_ERROR(("Volume::Mount: no matching partition descriptor found!\n")); @@ -241,9 +242,9 @@ Volume::Mount(const char *deviceName, off_t offset, off_t length, fBlockSize = blockSize; fBlockShift = blockShift; } - TRACE(("Volume::Mount: device = %d, offset = %Ld, length = %Ld, " - "blockSize = %ld, blockShift = %ld\n", device, offset, length, - blockSize, blockShift)); + TRACE(("Volume::Mount: device = %d, offset = %" B_PRIdOFF ", length = %" + B_PRIdOFF ", blockSize = %" B_PRIu32 ", blockShift = %" B_PRIu32 "\n", + device, offset, length, blockSize, blockShift)); // At this point we've found a valid set of volume descriptors and // our partitions are all set up. We now need to investigate the file // set descriptor pointed to by the logical volume descriptor. @@ -265,8 +266,9 @@ Volume::Mount(const char *deviceName, off_t offset, off_t length, = read_pos(device, address, chunk.Data(), blockSize); if (bytesRead != ssize_t(blockSize)) { status = B_IO_ERROR; - TRACE_ERROR(("read_pos(pos:%Ld, len:%ld) failed with: 0x%lx\n", - address, blockSize, bytesRead)); + TRACE_ERROR(("read_pos(pos:%" B_PRIdOFF ", len:%" B_PRIu32 + ") failed with: 0x%lx\n", address, blockSize, + bytesRead)); } } // See if it's valid, and if so, create the root icb @@ -286,21 +288,22 @@ Volume::Mount(const char *deviceName, off_t offset, off_t length, return B_NO_MEMORY; } - TRACE(("Volume::Mount: Root Node id = %Ld\n", fRootIcb->Id())); + TRACE(("Volume::Mount: Root Node id = %" B_PRIdINO "\n", + fRootIcb->Id())); if (!status) { status = publish_vnode(fFSVolume, fRootIcb->Id(), fRootIcb, &gUDFVnodeOps, fRootIcb->Mode(), 0); if (status != B_OK) { TRACE_ERROR(("Error creating vnode for root icb! " - "status = 0x%lx, `%s'\n", status, + "status = 0x%" B_PRIx32 ", `%s'\n", status, strerror(status))); // Clean up the icb we created, since _Unset() // won't do this for us. delete fRootIcb; fRootIcb = NULL; } - TRACE(("Volume::Mount: Root vnode published. Id = %Ld\n", - fRootIcb->Id())); + TRACE(("Volume::Mount: Root vnode published. Id = %" + B_PRIdINO "\n", fRootIcb->Id())); } } } @@ -330,10 +333,12 @@ Volume::Name() const { status_t Volume::MapBlock(long_address address, off_t *mappedBlock) { - TRACE(("Volume::MapBlock: partition = %d, block = %ld, mappedBlock = %p\n", - address.partition(), address.block(), mappedBlock)); - DEBUG_INIT_ETC("Volume", ("partition = %d, block = %ld, mappedBlock = %p", - address.partition(), address.block(), mappedBlock)); + TRACE(("Volume::MapBlock: partition = %d, block = %" B_PRIu32 + ", mappedBlock = %p\n", address.partition(), address.block(), + mappedBlock)); + DEBUG_INIT_ETC("Volume", ("partition = %d, block = %" B_PRIu32 + ", mappedBlock = %p", address.partition(), address.block(), + mappedBlock)); status_t error = mappedBlock ? B_OK : B_BAD_VALUE; if (!error) { Partition *partition = _GetPartition(address.partition()); diff --git a/src/add-ons/kernel/file_systems/udf/kernel_interface.cpp b/src/add-ons/kernel/file_systems/udf/kernel_interface.cpp index 06a3a292b9..7c0b6d40de 100644 --- a/src/add-ons/kernel/file_systems/udf/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/udf/kernel_interface.cpp @@ -410,8 +410,8 @@ udf_open_dir(fs_volume *volume, fs_vnode *vnode, void **cookie) DirectoryIterator *iterator = NULL; status_t status = dir->GetDirectoryIterator(&iterator); if (status != B_OK) { - TRACE_ERROR(("udf_open_dir: error getting directory iterator: 0x%lx, " - "`%s'\n", status, strerror(status))); + TRACE_ERROR(("udf_open_dir: error getting directory iterator: 0x%" + B_PRIx32 ", `%s'\n", status, strerror(status))); return status; } *cookie = (void *)iterator; From 9bc120ace13e2231d36b515dc3959572bc9da281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 15:45:30 +0200 Subject: [PATCH 061/136] mpu401: fixes 64 bit warnings --- src/add-ons/kernel/generic/mpu401/mpu401.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/add-ons/kernel/generic/mpu401/mpu401.c b/src/add-ons/kernel/generic/mpu401/mpu401.c index e68c99e2ec..cb61dc3f28 100644 --- a/src/add-ons/kernel/generic/mpu401/mpu401.c +++ b/src/add-ons/kernel/generic/mpu401/mpu401.c @@ -237,7 +237,7 @@ midi_close(void * cookie) delete_sem(mpu_device->writesemaphore); atomic_add(&mpu_device->count, -1); - PRINT(("midi_close() done (count = %lu)\n", mpu_device->count)); + PRINT(("midi_close() done (count = %" B_PRId32 ")\n", mpu_device->count)); return B_OK; } From e825d892e18b961648f911cc6acf0bcfbbd31258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 15:53:50 +0200 Subject: [PATCH 062/136] efi_gpt: fixes 64 bit warnings --- .../partitioning_systems/gpt/Header.cpp | 30 +++++++++---------- .../partitioning_systems/gpt/efi_gpt.cpp | 17 ++++++----- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/add-ons/kernel/partitioning_systems/gpt/Header.cpp b/src/add-ons/kernel/partitioning_systems/gpt/Header.cpp index 289f926ada..4fbc15965c 100644 --- a/src/add-ons/kernel/partitioning_systems/gpt/Header.cpp +++ b/src/add-ons/kernel/partitioning_systems/gpt/Header.cpp @@ -336,7 +336,7 @@ Header::_PrintGUID(const guid_t &id) { static char guid[48]; snprintf(guid, sizeof(guid), - "%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", + "%08" B_PRIx32 "-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", B_LENDIAN_TO_HOST_INT32(id.data1), B_LENDIAN_TO_HOST_INT16(id.data2), B_LENDIAN_TO_HOST_INT16(id.data3), id.data4[0], id.data4[1], id.data4[2], id.data4[3], id.data4[4], id.data4[5], id.data4[6], @@ -350,17 +350,17 @@ Header::_Dump(const efi_table_header& header) { dprintf("EFI header: %.8s\n", header.header); dprintf("EFI revision: %" B_PRIx32 "\n", header.Revision()); - dprintf("header size: %ld\n", header.HeaderSize()); - dprintf("header CRC: %ld\n", header.HeaderCRC()); - dprintf("absolute block: %Ld\n", header.AbsoluteBlock()); - dprintf("alternate block: %Ld\n", header.AlternateBlock()); - dprintf("first usable block: %Ld\n", header.FirstUsableBlock()); - dprintf("last usable block: %Ld\n", header.LastUsableBlock()); + dprintf("header size: %" B_PRId32 "\n", header.HeaderSize()); + dprintf("header CRC: %" B_PRId32 "\n", header.HeaderCRC()); + dprintf("absolute block: %" B_PRIu64 "\n", header.AbsoluteBlock()); + dprintf("alternate block: %" B_PRIu64 "\n", header.AlternateBlock()); + dprintf("first usable block: %" B_PRIu64 "\n", header.FirstUsableBlock()); + dprintf("last usable block: %" B_PRIu64 "\n", header.LastUsableBlock()); dprintf("disk GUID: %s\n", _PrintGUID(header.disk_guid)); - dprintf("entries block: %Ld\n", header.EntriesBlock()); - dprintf("entry size: %ld\n", header.EntrySize()); - dprintf("entry count: %ld\n", header.EntryCount()); - dprintf("entries CRC: %ld\n", header.EntriesCRC()); + dprintf("entries block: %" B_PRIu64 "\n", header.EntriesBlock()); + dprintf("entry size: %" B_PRIu32 "\n", header.EntrySize()); + dprintf("entry count: %" B_PRIu32 "\n", header.EntryCount()); + dprintf("entries CRC: %" B_PRIu32 "\n", header.EntriesCRC()); } @@ -373,14 +373,14 @@ Header::_DumpPartitions() if (entry.partition_type == kEmptyGUID) continue; - dprintf("[%3ld] partition type: %s\n", i, + dprintf("[%3" B_PRIu32 "] partition type: %s\n", i, _PrintGUID(entry.partition_type)); dprintf(" unique id: %s\n", _PrintGUID(entry.unique_guid)); - dprintf(" start block: %Ld\n", entry.StartBlock()); - dprintf(" end block: %Ld\n", entry.EndBlock()); + dprintf(" start block: %" B_PRIu64 "\n", entry.StartBlock()); + dprintf(" end block: %" B_PRIu64 "\n", entry.EndBlock()); dprintf(" size: %g MB\n", (entry.EndBlock() - entry.StartBlock()) * 512 / 1024.0 / 1024.0); - dprintf(" attributes: %Lx\n", entry.Attributes()); + dprintf(" attributes: %" B_PRIx64 "\n", entry.Attributes()); char name[64]; to_utf8(entry.name, EFI_PARTITION_NAME_LENGTH, name, sizeof(name)); diff --git a/src/add-ons/kernel/partitioning_systems/gpt/efi_gpt.cpp b/src/add-ons/kernel/partitioning_systems/gpt/efi_gpt.cpp index 8dbf7ad741..ad8f784bca 100644 --- a/src/add-ons/kernel/partitioning_systems/gpt/efi_gpt.cpp +++ b/src/add-ons/kernel/partitioning_systems/gpt/efi_gpt.cpp @@ -119,7 +119,8 @@ efi_gpt_scan_partition(int fd, partition_data* partition, void* _cookie) partition->offset + entry.StartBlock() * partition->block_size, entry.BlockCount() * partition->block_size, -1); if (child == NULL) { - TRACE(("efi_gpt: Creating child at index %ld failed\n", index - 1)); + TRACE(("efi_gpt: Creating child at index %" B_PRIu32 " failed\n", + index - 1)); return B_ERROR; } @@ -128,7 +129,7 @@ efi_gpt_scan_partition(int fd, partition_data* partition, void* _cookie) child->name = strdup(name); child->type = strdup(get_partition_type(entry.partition_type)); child->block_size = partition->block_size; - child->cookie = (void*)i; + child->cookie = (void*)(addr_t)i; } return B_OK; @@ -492,7 +493,7 @@ efi_gpt_resize_child(int fd, partition_id partitionID, off_t size, if (header == NULL) return B_BAD_VALUE; - uint32 entryIndex = (uint32)child->cookie; + uint32 entryIndex = (uint32)(addr_t)child->cookie; if (entryIndex >= header->EntryCount()) return B_BAD_VALUE; @@ -553,7 +554,7 @@ efi_gpt_move_child(int fd, partition_id partitionID, partition_id childID, if (header == NULL) return B_BAD_VALUE; - uint32 entryIndex = (uint32)child->cookie; + uint32 entryIndex = (uint32)(addr_t)child->cookie; if (entryIndex >= header->EntryCount()) return B_BAD_VALUE; @@ -614,7 +615,7 @@ efi_gpt_set_content_name(int fd, partition_id partitionID, const char* name, if (header == NULL) return B_BAD_VALUE; - uint32 entryIndex = (uint32)child->cookie; + uint32 entryIndex = (uint32)(addr_t)child->cookie; if (entryIndex >= header->EntryCount()) return B_BAD_VALUE; @@ -660,7 +661,7 @@ efi_gpt_set_type(int fd, partition_id partitionID, const char* type, if (header == NULL) return B_BAD_VALUE; - uint32 entryIndex = (uint32)child->cookie; + uint32 entryIndex = (uint32)(addr_t)child->cookie; if (entryIndex >= header->EntryCount()) return B_BAD_VALUE; @@ -777,7 +778,7 @@ efi_gpt_create_child(int fd, partition_id partitionID, off_t offset, child->name = strdup(name); child->type = strdup(type); child->parameters = strdup(parameters); - child->cookie = (void*)entryIndex; + child->cookie = (void*)(addr_t)entryIndex; if (child->type == NULL || child->parameters == NULL) { delete_partition(child->id); @@ -813,7 +814,7 @@ efi_gpt_delete_child(int fd, partition_id partitionID, partition_id childID, if (header == NULL) return B_BAD_VALUE; - uint32 entryIndex = (uint32)child->cookie; + uint32 entryIndex = (uint32)(addr_t)child->cookie; if (entryIndex >= header->EntryCount()) return B_BAD_VALUE; From 1f6d4bcfd316782cc45150c3277b8e50decd8c16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 16:03:38 +0200 Subject: [PATCH 063/136] echo: fixes 64 bit warnings --- .../kernel/drivers/audio/echo/midi.cpp | 6 +++-- .../kernel/drivers/audio/echo/multi.cpp | 25 +++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/add-ons/kernel/drivers/audio/echo/midi.cpp b/src/add-ons/kernel/drivers/audio/echo/midi.cpp index d10d16dd55..f90302f56a 100644 --- a/src/add-ons/kernel/drivers/audio/echo/midi.cpp +++ b/src/add-ons/kernel/drivers/audio/echo/midi.cpp @@ -131,13 +131,15 @@ midi_read(void* cookie, off_t pos, void* ptr, size_t* nread) static status_t -midi_write(void* cookie, off_t pos, const void* ptr, size_t* nwritten) +midi_write(void* cookie, off_t pos, const void* ptr, size_t* _nwritten) { echo_dev *card = (echo_dev *) cookie; ECHOSTATUS err; + DWORD nwritten = *_nwritten; LOG(("midi_write()\n")); - err = card->pEG->WriteMidi(*nwritten, (PBYTE)ptr, nwritten); + err = card->pEG->WriteMidi(nwritten, (PBYTE)ptr, &nwritten); + *_nwritten = nwritten; return (err != ECHOSTATUS_OK) ? B_ERROR : B_OK; } diff --git a/src/add-ons/kernel/drivers/audio/echo/multi.cpp b/src/add-ons/kernel/drivers/audio/echo/multi.cpp index ffd364c897..9388550161 100644 --- a/src/add-ons/kernel/drivers/audio/echo/multi.cpp +++ b/src/add-ons/kernel/drivers/audio/echo/multi.cpp @@ -97,8 +97,8 @@ echo_channel_get_mix(void *card, MIXER_AUDIO_CHANNEL channel, int32 type, float } else { values[0] = function[0].Data.iNominal == 4 ? 1.0 : 0.0; } - PRINT(("echo_channel_get_mix iLevel: %ld, %d, %ld\n", function[0].Data.iLevel, - channel.wChannel, channel.dwType)); + PRINT(("echo_channel_get_mix iLevel: %" B_PRId32 ", %d, %" B_PRIu32 + "\n", function[0].Data.iLevel, channel.wChannel, channel.dwType)); } } @@ -134,8 +134,8 @@ echo_channel_set_mix(void *card, MIXER_AUDIO_CHANNEL channel, int32 type, float dev->pEG->ProcessMixerMultiFunction(multi_function, size); if (function[0].RtnStatus == ECHOSTATUS_OK) { - PRINT(("echo_channel_set_mix OK: %ld, %d, %ld\n", function[0].Data.iLevel, - channel.wChannel, channel.dwType)); + PRINT(("echo_channel_set_mix OK: %" B_PRId32 ", %d, %" B_PRIu32 "\n", + function[0].Data.iLevel, channel.wChannel, channel.dwType)); } } @@ -242,7 +242,7 @@ echo_create_controls_list(multi_dev *multi) } multi->control_count = index; - PRINT(("multi->control_count %lu\n", multi->control_count)); + PRINT(("multi->control_count %" B_PRIu32 "\n", multi->control_count)); return B_OK; } @@ -256,7 +256,8 @@ echo_get_mix(echo_dev *card, multi_mix_value_info * mmvi) for (i = 0; i < mmvi->item_count; i++) { id = mmvi->values[i].id - MULTI_CONTROL_FIRSTID; if (id < 0 || id >= card->multi.control_count) { - PRINT(("echo_get_mix : invalid control id requested : %li\n", id)); + PRINT(("echo_get_mix : invalid control id requested : %" B_PRIu32 + "\n", id)); continue; } control = &card->multi.controls[id]; @@ -297,7 +298,8 @@ echo_set_mix(echo_dev *card, multi_mix_value_info * mmvi) for (i = 0; i < mmvi->item_count; i++) { id = mmvi->values[i].id - MULTI_CONTROL_FIRSTID; if (id < 0 || id >= card->multi.control_count) { - PRINT(("echo_set_mix : invalid control id requested : %li\n", id)); + PRINT(("echo_set_mix : invalid control id requested : %" B_PRIu32 + "\n", id)); continue; } control = &card->multi.controls[id]; @@ -307,7 +309,8 @@ echo_set_mix(echo_dev *card, multi_mix_value_info * mmvi) if (i + 1 < mmvi->item_count) { id = mmvi->values[i + 1].id - MULTI_CONTROL_FIRSTID; if (id < 0 || id >= card->multi.control_count) { - PRINT(("echo_set_mix : invalid control id requested : %li\n", id)); + PRINT(("echo_set_mix : invalid control id requested : %" + B_PRIu32 "\n", id)); } else { control2 = &card->multi.controls[id]; if (control2->mix_control.master != control->mix_control.id) @@ -995,21 +998,21 @@ echo_open(const char *name, uint32 flags, void** cookie) value = strtoul (item, &end, 0); if (*end == '\0') current_settings.sample_rate = value; } - PRINT(("sample_rate %lu\n", current_settings.sample_rate)); + PRINT(("sample_rate %" B_PRIu32 "\n", current_settings.sample_rate)); item = get_driver_parameter (settings_handle, "buffer_frames", NULL, NULL); if (item) { value = strtoul (item, &end, 0); if (*end == '\0') current_settings.buffer_frames = value; } - PRINT(("buffer_frames %lu\n", current_settings.buffer_frames)); + PRINT(("buffer_frames %" B_PRIu32 "\n", current_settings.buffer_frames)); item = get_driver_parameter (settings_handle, "buffer_count", NULL, NULL); if (item) { value = strtoul (item, &end, 0); if (*end == '\0') current_settings.buffer_count = value; } - PRINT(("buffer_count %lu\n", current_settings.buffer_count)); + PRINT(("buffer_count %" B_PRId32 "\n", current_settings.buffer_count)); unload_driver_settings (settings_handle); } From 2f66d0df8e89e5481e9b0d51817106999c9db4b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 16:16:43 +0200 Subject: [PATCH 064/136] usb_midi: fixes 64 bit warnings --- .../kernel/drivers/midi/usb_midi/usb_midi.cpp | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/add-ons/kernel/drivers/midi/usb_midi/usb_midi.cpp b/src/add-ons/kernel/drivers/midi/usb_midi/usb_midi.cpp index 51177adc16..eebaff2ede 100644 --- a/src/add-ons/kernel/drivers/midi/usb_midi/usb_midi.cpp +++ b/src/add-ons/kernel/drivers/midi/usb_midi/usb_midi.cpp @@ -94,7 +94,7 @@ create_device(const usb_device* dev, uint16 ifno) midiDevice->sem_lock = sem = create_sem(1, DRIVER_NAME "_lock"); if (sem < 0) { - DPRINTF_ERR((MY_ID "create_sem() failed 0x%lx\n", sem)); + DPRINTF_ERR((MY_ID "create_sem() failed 0x%" B_PRIx32 "\n", sem)); free(midiDevice); return NULL; } @@ -104,7 +104,7 @@ create_device(const usb_device* dev, uint16 ifno) (void**)&midiDevice->buffer, B_ANY_KERNEL_ADDRESS, B_PAGE_SIZE, B_CONTIGUOUS, B_READ_AREA | B_WRITE_AREA); if (area < 0) { - DPRINTF_ERR((MY_ID "create_area() failed 0x%lx\n", area)); + DPRINTF_ERR((MY_ID "create_area() failed 0x%" B_PRIx32 "\n", area)); delete_sem(midiDevice->sem_lock); free(midiDevice); return NULL; @@ -114,7 +114,7 @@ create_device(const usb_device* dev, uint16 ifno) (usb_midi_event_packet*)((uint8*)midiDevice->buffer + B_PAGE_SIZE / 2); midiDevice->sem_send = sem = create_sem(1, DRIVER_NAME "_send"); if (sem < 0) { - DPRINTF_ERR((MY_ID "create_sem() failed 0x%lx\n", sem)); + DPRINTF_ERR((MY_ID "create_sem() failed 0x%" B_PRIx32 "\n", sem)); delete_sem(midiDevice->sem_lock); delete_area(area); free(midiDevice); @@ -278,7 +278,7 @@ midi_usb_read_callback(void* cookie, status_t status, (usb_callback_func)midi_usb_read_callback, midiDevice); if (st != B_OK) { /* probably endpoint stall */ - DPRINTF_ERR((MY_ID "queue_bulk() error 0x%lx\n", st)); + DPRINTF_ERR((MY_ID "queue_bulk() error 0x%" B_PRIx32 "\n", st)); } } @@ -358,7 +358,8 @@ usb_midi_added(const usb_device* dev, void** cookie) got_one: if ((status = usb->set_configuration(dev, conf)) != B_OK) { - DPRINTF_ERR((MY_ID "set_configuration() failed 0x%lx\n", status)); + DPRINTF_ERR((MY_ID "set_configuration() failed 0x%" B_PRIx32 "\n", + status)); return B_ERROR; } @@ -430,7 +431,7 @@ got_one: midiDevice->inMaxPkt, (usb_callback_func)midi_usb_read_callback, midiDevice); if (status != B_OK) { - DPRINTF_ERR((MY_ID "queue_bulk() error 0x%lx\n", status)); + DPRINTF_ERR((MY_ID "queue_bulk() error 0x%" B_PRIx32 "\n", status)); return B_ERROR; } @@ -504,7 +505,8 @@ usb_midi_open(const char* name, uint32 flags, assert(name != NULL); assert(out_cookie != NULL); - DPRINTF_INFO((MY_ID "usb_midi_open(%s) flags=%lx\n", name, flags)); + DPRINTF_INFO((MY_ID "usb_midi_open(%s) flags=%" B_PRIx32 "\n", name, + flags)); if ((port = search_port_info(name)) == NULL) return B_ENTRY_NOT_FOUND; @@ -519,7 +521,8 @@ usb_midi_open(const char* name, uint32 flags, cookie->sem_cb = create_sem(0, DRIVER_NAME "_cb"); if (cookie->sem_cb < 0) { - DPRINTF_ERR((MY_ID "create_sem() failed 0x%lx\n", cookie->sem_cb)); + DPRINTF_ERR((MY_ID "create_sem() failed 0x%" B_PRIx32 "\n", + cookie->sem_cb)); free(cookie); return B_ERROR; } @@ -674,8 +677,8 @@ usb_midi_write(driver_cookie* cookie, off_t position, * packet_count, (usb_callback_func)midi_usb_write_callback, midiDevice); if (status != B_OK) { - DPRINTF_ERR((MY_ID "midi write queue_bulk() error 0x%lx\n", - status)); + DPRINTF_ERR((MY_ID "midi write queue_bulk() error 0x%" B_PRIx32 + "\n", status)); return B_ERROR; } } From f0704f6ba43d77938c9856c0dcb3c84c106f9c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 16:22:15 +0200 Subject: [PATCH 065/136] usb_raw: fixes 64 bit warnings --- src/add-ons/kernel/drivers/bus/usb/usb_raw.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/add-ons/kernel/drivers/bus/usb/usb_raw.cpp b/src/add-ons/kernel/drivers/bus/usb/usb_raw.cpp index d430080f19..3199d03d02 100644 --- a/src/add-ons/kernel/drivers/bus/usb/usb_raw.cpp +++ b/src/add-ons/kernel/drivers/bus/usb/usb_raw.cpp @@ -49,7 +49,7 @@ static char **gDeviceNames = NULL; static status_t usb_raw_device_added(usb_device newDevice, void **cookie) { - TRACE((DRIVER_NAME": device_added(0x%08lx)\n", newDevice)); + TRACE((DRIVER_NAME": device_added(0x%08" B_PRIx32 ")\n", newDevice)); raw_device *device = (raw_device *)malloc(sizeof(raw_device)); mutex_init(&device->lock, "usb_raw device lock"); @@ -66,7 +66,7 @@ usb_raw_device_added(usb_device newDevice, void **cookie) if (gUSBModule->usb_ioctl('DNAM', deviceName, sizeof(deviceName)) >= B_OK) { snprintf(device->name, sizeof(device->name), "bus/usb/%s", deviceName); } else { - snprintf(device->name, sizeof(device->name), "bus/usb/%08lx", + snprintf(device->name, sizeof(device->name), "bus/usb/%08" B_PRIx32, newDevice); } @@ -79,7 +79,7 @@ usb_raw_device_added(usb_device newDevice, void **cookie) gDeviceCount++; mutex_unlock(&gDeviceListLock); - TRACE((DRIVER_NAME": new device: 0x%08lx\n", (uint32)device)); + TRACE((DRIVER_NAME": new device: 0x%p\n", device)); *cookie = (void *)device; return B_OK; } @@ -88,7 +88,7 @@ usb_raw_device_added(usb_device newDevice, void **cookie) static status_t usb_raw_device_removed(void *cookie) { - TRACE((DRIVER_NAME": device_removed(0x%08lx)\n", (uint32)cookie)); + TRACE((DRIVER_NAME": device_removed(0x%p)\n", cookie)); raw_device *device = (raw_device *)cookie; mutex_lock(&gDeviceListLock); @@ -825,7 +825,8 @@ init_driver() status_t result = get_module(B_USB_MODULE_NAME, (module_info **)&gUSBModule); if (result < B_OK) { - TRACE((DRIVER_NAME": getting module failed 0x%08lx\n", result)); + TRACE((DRIVER_NAME": getting module failed 0x%08" B_PRIx32 "\n", + result)); mutex_destroy(&gDeviceListLock); return result; } From 69a33f8c3c18451e9dd24a81513e8b63614c5d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 16:40:49 +0200 Subject: [PATCH 066/136] usb_floppy: fixes 64 bit warnings --- .../drivers/disk/usb/usb_floppy/usb_disk.cpp | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp b/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp index 0f19f99826..8621489b44 100644 --- a/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp +++ b/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp @@ -18,7 +18,7 @@ #define DRIVER_NAME "usb_floppy" #define DEVICE_NAME_BASE "disk/ufi/" -#define DEVICE_NAME DEVICE_NAME_BASE"%ld/%d/raw" +#define DEVICE_NAME DEVICE_NAME_BASE "%" B_PRId32 "/%d/raw" //#define TRACE_USB_DISK @@ -113,7 +113,7 @@ status_t usb_disk_transfer_data(disk_device *device, bool directionIn, status_t usb_disk_receive_csw(disk_device *device, command_status_wrapper *status); status_t usb_disk_operation(device_lun *lun, uint8* operation, - void *data, uint32 *dataLength, + void *data, size_t *dataLength, bool directionIn); status_t usb_disk_send_diagnostic(device_lun *lun); @@ -194,7 +194,7 @@ usb_disk_transfer_data(disk_device *device, bool directionIn, void *data, void -usb_disk_interrupt(void* cookie, int32 status, void* data, uint32 length) +usb_disk_interrupt(void* cookie, int32 status, void* data, size_t length) { disk_device* dev = (disk_device*)cookie; // We release the lock even if the interrupt is invalid. This way there @@ -202,7 +202,8 @@ usb_disk_interrupt(void* cookie, int32 status, void* data, uint32 length) release_sem(dev->interruptLock); if (length != 2) { - TRACE_ALWAYS("interrupt of length %ld! (expected 2)\n", length); + TRACE_ALWAYS("interrupt of length %" B_PRIuSIZE "! (expected 2)\n", + length); // In this case we do not reschedule the interrupt. This means the // driver will be locked. The interrupt should perhaps be scheduled // when starting a transfer instead. But getting there means something @@ -234,7 +235,7 @@ usb_disk_receive_csw(disk_device *device, command_status_wrapper *status) status_t usb_disk_operation(device_lun *lun, uint8* operation, - void *data, uint32 *dataLength, bool directionIn) + void *data, size_t *dataLength, bool directionIn) { // TODO: remove transferLength TRACE("operation: lun: %u; op: 0x%x; data: %p; dlen: %p (%lu); in: %c\n", @@ -342,7 +343,7 @@ usb_disk_send_diagnostic(device_lun *lun) status_t usb_disk_request_sense(device_lun *lun) { - uint32 dataLength = sizeof(scsi_request_sense_6_parameter); + size_t dataLength = sizeof(scsi_request_sense_6_parameter); uint8 commandBlock[12]; memset(commandBlock, 0, sizeof(commandBlock)); @@ -413,7 +414,7 @@ usb_disk_request_sense(device_lun *lun) status_t usb_disk_mode_sense(device_lun *lun) { - uint32 dataLength = sizeof(scsi_mode_sense_6_parameter); + size_t dataLength = sizeof(scsi_mode_sense_6_parameter); uint8 commandBlock[12]; memset(commandBlock, 0, sizeof(commandBlock)); @@ -459,7 +460,7 @@ usb_disk_test_unit_ready(device_lun *lun) status_t usb_disk_inquiry(device_lun *lun) { - uint32 dataLength = sizeof(scsi_inquiry_6_parameter); + size_t dataLength = sizeof(scsi_inquiry_6_parameter); uint8 commandBlock[12]; memset(commandBlock, 0, sizeof(commandBlock)); @@ -526,7 +527,7 @@ usb_disk_reset_capacity(device_lun *lun) status_t usb_disk_update_capacity(device_lun *lun) { - uint32 dataLength = sizeof(scsi_read_capacity_10_parameter); + size_t dataLength = sizeof(scsi_read_capacity_10_parameter); scsi_read_capacity_10_parameter parameter; status_t result = B_ERROR; @@ -1172,7 +1173,7 @@ usb_disk_ioctl(void *cookie, uint32 op, void *buffer, size_t length) #endif default: - TRACE_ALWAYS("unhandled ioctl %ld\n", op); + TRACE_ALWAYS("unhandled ioctl %" B_PRIu32 "\n", op); break; } @@ -1223,7 +1224,7 @@ usb_disk_read(void *cookie, off_t position, void *buffer, size_t *length) } *length = 0; - TRACE_ALWAYS("read fails with 0x%08lx\n", result); + TRACE_ALWAYS("read fails with 0x%08" B_PRIx32 "\n", result); return result; } @@ -1274,7 +1275,7 @@ usb_disk_write(void *cookie, off_t position, const void *buffer, } *length = 0; - TRACE_ALWAYS("write fails with 0x%08lx\n", result); + TRACE_ALWAYS("write fails with 0x%08" B_PRIx32 "\n", result); return result; } @@ -1314,7 +1315,7 @@ init_driver() status_t result = get_module(B_USB_MODULE_NAME, (module_info **)&gUSBModule); if (result < B_OK) { - TRACE_ALWAYS("getting module failed 0x%08lx\n", result); + TRACE_ALWAYS("getting module failed 0x%08" B_PRIx32 "\n", result); mutex_destroy(&gDeviceListLock); return result; } From d47767ba38b14e80f993833edc5db2b3dadcb829 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 16:46:02 +0200 Subject: [PATCH 067/136] usb_printer: fixes 64 bit warnings --- .../drivers/printer/usb/usb_printer.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp b/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp index be475d884e..c690db3339 100644 --- a/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp +++ b/src/add-ons/kernel/drivers/printer/usb/usb_printer.cpp @@ -18,7 +18,7 @@ #define DRIVER_NAME "usb_printer" #define DEVICE_NAME_BASE "printer/usb/" -#define DEVICE_NAME DEVICE_NAME_BASE"%ld" +#define DEVICE_NAME DEVICE_NAME_BASE "%" B_PRId32 #define SECONDS ((bigtime_t)1000 * 1000) #define MINUTES (60 * SECONDS) @@ -142,7 +142,7 @@ usb_printer_callback(void *cookie, status_t status, void *data, static status_t usb_printer_device_added(usb_device newDevice, void **cookie) { - TRACE("device_added(0x%08lx)\n", newDevice); + TRACE("device_added(0x%08" B_PRIx32 ")\n", newDevice); printer_device *device = (printer_device *)malloc(sizeof(printer_device)); device->device = newDevice; device->removed = false; @@ -261,7 +261,7 @@ usb_printer_device_added(usb_device newDevice, void **cookie) sprintf(device->name, DEVICE_NAME, deviceNumber); mutex_unlock(&gDeviceListLock); - TRACE("new device: 0x%08lx\n", (uint32)device); + TRACE("new device: 0x%p\n", device); *cookie = (void *)device; return B_OK; } @@ -270,7 +270,7 @@ usb_printer_device_added(usb_device newDevice, void **cookie) static status_t usb_printer_device_removed(void *cookie) { - TRACE("device_removed(0x%08lx)\n", (uint32)cookie); + TRACE("device_removed(0x%p)\n", cookie); printer_device *device = (printer_device *)cookie; mutex_lock(&gDeviceListLock); @@ -412,7 +412,7 @@ usb_printer_ioctl(void *cookie, uint32 op, void *buffer, size_t length) } default: - TRACE_ALWAYS("unhandled ioctl %ld\n", op); + TRACE_ALWAYS("unhandled ioctl %" B_PRIu32 "\n", op); break; } @@ -459,7 +459,7 @@ usb_printer_read(void *cookie, off_t position, void *buffer, size_t *length) if (buffer == NULL || length == NULL) return B_BAD_VALUE; - TRACE("read(%lld, %ld)\n", position, *length); + TRACE("read(%" B_PRIdOFF ", %" B_PRIuSIZE ")\n", position, *length); printer_device *device = (printer_device *)cookie; mutex_lock(&device->lock); if (device->removed) { @@ -472,12 +472,12 @@ usb_printer_read(void *cookie, off_t position, void *buffer, size_t *length) mutex_unlock(&device->lock); if (result == B_OK) { - TRACE("read successful with %ld bytes\n", *length); + TRACE("read successful with %" B_PRIuSIZE " bytes\n", *length); return B_OK; } *length = 0; - TRACE_ALWAYS("read fails with 0x%08lx\n", result); + TRACE_ALWAYS("read fails with 0x%08" B_PRIx32 "\n", result); return result; } @@ -489,7 +489,7 @@ usb_printer_write(void *cookie, off_t position, const void *buffer, if (buffer == NULL || length == NULL) return B_BAD_VALUE; - TRACE("write(%lld, %ld)\n", position, *length); + TRACE("write(%" B_PRIdOFF ", %" B_PRIuSIZE ")\n", position, *length); printer_device *device = (printer_device *)cookie; mutex_lock(&device->lock); if (device->removed) { @@ -503,12 +503,12 @@ usb_printer_write(void *cookie, off_t position, const void *buffer, mutex_unlock(&device->lock); if (result == B_OK) { - TRACE("write successful with %ld bytes\n", *length); + TRACE("write successful with %" B_PRIuSIZE " bytes\n", *length); return B_OK; } *length = 0; - TRACE_ALWAYS("write fails with 0x%08lx\n", result); + TRACE_ALWAYS("write fails with 0x%08" B_PRIx32 "\n", result); return result; } @@ -551,7 +551,7 @@ init_driver() status_t result = get_module(B_USB_MODULE_NAME, (module_info **)&gUSBModule); if (result < B_OK) { - TRACE_ALWAYS("getting module failed 0x%08lx\n", result); + TRACE_ALWAYS("getting module failed 0x%08" B_PRIx32 "\n", result); mutex_destroy(&gDeviceListLock); return result; } From 4e159473a930a1e3b635fb8aa79d824512a0ea22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 17:05:06 +0200 Subject: [PATCH 068/136] nbd: fixes 64 bit warnings --- .../kernel/drivers/disk/virtual/nbd/nbd.c | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/add-ons/kernel/drivers/disk/virtual/nbd/nbd.c b/src/add-ons/kernel/drivers/disk/virtual/nbd/nbd.c index f3cc5e8dbe..21068357dd 100644 --- a/src/add-ons/kernel/drivers/disk/virtual/nbd/nbd.c +++ b/src/add-ons/kernel/drivers/disk/virtual/nbd/nbd.c @@ -174,7 +174,8 @@ status_t nbd_alloc_request(struct nbd_device *dev, struct nbd_request_entry **re struct nbd_request_entry *r; status_t err = EINVAL; uint64 handle; - PRINT((DP ">%s(%ld, %Ld, %ld)\n", __FUNCTION__, type, from, len)); + PRINT((DP ">%s(%" B_PRIu32 ", %" B_PRIdOFF ", %ld)\n", __FUNCTION__, type, + from, len)); if (type != NBD_CMD_READ && type != NBD_CMD_WRITE && type != NBD_CMD_DISC) return err; @@ -223,14 +224,14 @@ status_t nbd_alloc_request(struct nbd_device *dev, struct nbd_request_entry **re err1: free(r); err0: - dprintf(DP " %s: error 0x%08lx\n", __FUNCTION__, err); + dprintf(DP " %s: error 0x%08" B_PRIx32 "\n", __FUNCTION__, err); return err; } status_t nbd_queue_request(struct nbd_device *dev, struct nbd_request_entry *req) { - PRINT((DP ">%s(handle:%Ld)\n", __FUNCTION__, req->handle)); + PRINT((DP ">%s(handle:%" B_PRIu64 ")\n", __FUNCTION__, req->handle)); req->next = dev->reqs; dev->reqs = req; return B_OK; @@ -240,7 +241,7 @@ status_t nbd_queue_request(struct nbd_device *dev, struct nbd_request_entry *req status_t nbd_dequeue_request(struct nbd_device *dev, uint64 handle, struct nbd_request_entry **req) { struct nbd_request_entry *r, *prev; - PRINT((DP ">%s(handle:%Ld)\n", __FUNCTION__, handle)); + PRINT((DP ">%s(handle:%" B_PRIu64 ")\n", __FUNCTION__, handle)); r = dev->reqs; prev = NULL; while (r && r->handle != handle) { @@ -262,7 +263,7 @@ status_t nbd_dequeue_request(struct nbd_device *dev, uint64 handle, struct nbd_r status_t nbd_free_request(struct nbd_device *dev, struct nbd_request_entry *req) { - PRINT((DP ">%s(handle:%Ld)\n", __FUNCTION__, req->handle)); + PRINT((DP ">%s(handle:%" B_PRIu64 ")\n", __FUNCTION__, req->handle)); delete_sem(req->sem); free(req); return B_OK; @@ -354,7 +355,7 @@ int32 nbd_postoffice(void *arg) return 0; err: - dprintf(DP "%s: %s: error 0x%08lx\n", __FUNCTION__, reason, err); + dprintf(DP "%s: %s: error 0x%08" B_PRIx32 "\n", __FUNCTION__, reason, err); return err; } @@ -397,7 +398,8 @@ status_t nbd_connect(struct nbd_device *dev) dev->size = B_BENDIAN_TO_HOST_INT64(initpkt.device_size); - dprintf(DP " %s: connected, device size %Ld bytes.\n", __FUNCTION__, dev->size); + dprintf(DP " %s: connected, device size %" B_PRIu64 " bytes.\n", + __FUNCTION__, dev->size); err = dev->postoffice = spawn_kernel_thread(nbd_postoffice, "nbd postoffice", B_REAL_TIME_PRIORITY, dev); if (err < B_OK) @@ -415,7 +417,7 @@ err1: kclosesocket(dev->sock); dev->sock = -1; err0: - dprintf(DP "<%s: error 0x%08lx\n", __FUNCTION__, err); + dprintf(DP "<%s: error 0x%08" B_PRIx32 "\n", __FUNCTION__, err); return err; } @@ -435,7 +437,7 @@ status_t nbd_teardown(struct nbd_device *dev) status_t nbd_post_request(struct nbd_device *dev, struct nbd_request_entry *req) { status_t err; - PRINT((DP ">%s(handle:%Ld)\n", __FUNCTION__, req->handle)); + PRINT((DP ">%s(handle:%" B_PRIu64 ")\n", __FUNCTION__, req->handle)); err = ksend(dev->sock, &req->req, sizeof(req->req), 0); if (err < 0) @@ -466,7 +468,7 @@ status_t nbd_open(const char *name, uint32 flags, cookie_t **cookie) { int kfd; #endif struct nbd_device *dev = NULL; - PRINT((DP ">%s(%s, %lx, )\n", __FUNCTION__, name, flags)); + PRINT((DP ">%s(%s, %" B_PRIx32 ", )\n", __FUNCTION__, name, flags)); (void)name; (void)flags; dev = nbd_find_device(name); if (!dev || !dev->valid) @@ -509,7 +511,7 @@ err2: err1: free(*cookie); err0: - dprintf(DP " %s: error 0x%08lx\n", __FUNCTION__, err); + dprintf(DP " %s: error 0x%08" B_PRIx32 "\n", __FUNCTION__, err); return err; } @@ -564,7 +566,8 @@ status_t nbd_free(cookie_t *cookie) { status_t nbd_control(cookie_t *cookie, uint32 op, void *data, size_t len) { - PRINT((DP ">%s(%d, %lu, , %ld)\n", __FUNCTION__, WHICH(cookie->dev), op, len)); + PRINT((DP ">%s(%d, %" B_PRIu32 ", , %ld)\n", __FUNCTION__, + WHICH(cookie->dev), op, len)); switch (op) { case B_GET_DEVICE_SIZE: /* this one is broken anyway... */ if (data) { @@ -623,7 +626,8 @@ status_t nbd_read(cookie_t *cookie, off_t position, void *data, size_t *numbytes struct nbd_device *dev = cookie->dev; struct nbd_request_entry *req; status_t err, semerr; - PRINT((DP ">%s(%d, %Ld, , )\n", __FUNCTION__, WHICH(cookie->dev), position)); + PRINT((DP ">%s(%d, %" B_PRIdOFF ", , )\n", __FUNCTION__, + WHICH(cookie->dev), position)); if (position < 0) return EINVAL; @@ -692,7 +696,8 @@ status_t nbd_write(cookie_t *cookie, off_t position, const void *data, size_t *n struct nbd_device *dev = cookie->dev; struct nbd_request_entry *req; status_t err, semerr; - PRINT((DP ">%s(%d, %Ld, %ld, )\n", __FUNCTION__, WHICH(cookie->dev), position, *numbytes)); + PRINT((DP ">%s(%d, %" B_PRIdOFF ", %ld, )\n", __FUNCTION__, + WHICH(cookie->dev), position, *numbytes)); if (position < 0) return EINVAL; From 6849e7cc153e8f47c50cb031b3b7fec102facf2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 17:21:55 +0200 Subject: [PATCH 069/136] cx23882: fixes 64 bit warnings --- .../kernel/drivers/dvb/cx23882/cx23882.c | 6 ++-- .../kernel/drivers/dvb/cx23882/cx23882.h | 4 +-- .../kernel/drivers/dvb/cx23882/dtt7592.c | 3 +- .../drivers/dvb/cx23882/dvb_interface.c | 8 +++-- src/add-ons/kernel/drivers/dvb/cx23882/util.c | 31 ++++++++++--------- src/add-ons/kernel/drivers/dvb/cx23882/util.h | 6 ++-- 6 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/add-ons/kernel/drivers/dvb/cx23882/cx23882.c b/src/add-ons/kernel/drivers/dvb/cx23882/cx23882.c index dcba84cc35..b0d33e5c50 100644 --- a/src/add-ons/kernel/drivers/dvb/cx23882/cx23882.c +++ b/src/add-ons/kernel/drivers/dvb/cx23882/cx23882.c @@ -244,7 +244,9 @@ cx23882_int(void *data) if (mstat & (PCI_INT_STAT_HST_INT | PCI_INT_STAT_VIP_INT | PCI_INT_STAT_AUD_INT | PCI_INT_STAT_VID_INT)) { // serious error, these bits should not be set - dprintf("cx23882_int error: msk 0x%08lx, stat 0x%08lx, mstat 0x%08lx\n", reg_read32(REG_PCI_INT_MSK), reg_read32(REG_PCI_INT_STAT), mstat); + dprintf("cx23882_int error: msk 0x%08" B_PRIx32 ", stat 0x%08" B_PRIx32 + ", mstat 0x%08" B_PRIx32 "\n", reg_read32(REG_PCI_INT_MSK), + reg_read32(REG_PCI_INT_STAT), mstat); reg_write32(REG_PCI_INT_MSK, 0); return B_HANDLED_INTERRUPT; } @@ -254,7 +256,7 @@ cx23882_int(void *data) reg_write32(REG_PCI_INT_STAT, wmstat); if (wmstat) - dprintf("cx23882_int got 0x%08lx\n", wmstat); + dprintf("cx23882_int got 0x%08" B_PRIx32 "\n", wmstat); if (mstat & PCI_INT_STAT_TS_INT) { cx23882_mpegts_int(device); diff --git a/src/add-ons/kernel/drivers/dvb/cx23882/cx23882.h b/src/add-ons/kernel/drivers/dvb/cx23882/cx23882.h index 0204c6cb79..56b7f4f4a5 100644 --- a/src/add-ons/kernel/drivers/dvb/cx23882/cx23882.h +++ b/src/add-ons/kernel/drivers/dvb/cx23882/cx23882.h @@ -40,10 +40,10 @@ typedef struct { area_id dma_buf1_area; void * dma_buf1_virt; - void * dma_buf1_phys; + phys_addr_t dma_buf1_phys; area_id dma_buf2_area; void * dma_buf2_virt; - void * dma_buf2_phys; + phys_addr_t dma_buf2_phys; sem_id capture_sem; void * capture_data; diff --git a/src/add-ons/kernel/drivers/dvb/cx23882/dtt7592.c b/src/add-ons/kernel/drivers/dvb/cx23882/dtt7592.c index 06a36ad8c4..8940641e5e 100644 --- a/src/add-ons/kernel/drivers/dvb/cx23882/dtt7592.c +++ b/src/add-ons/kernel/drivers/dvb/cx23882/dtt7592.c @@ -68,7 +68,8 @@ dtt7592_set_frequency(i2c_bus *bus, uint32 frequency, dvb_bandwidth_t bandwidth) if (divider > 0x7fff) divider = 0x7fff; - TRACE("dtt7592_set_frequency frequency %ld, divider 0x%lx (%ld)\n", frequency, divider, divider); + TRACE("dtt7592_set_frequency frequency %" B_PRId32 ", divider 0x%" + B_PRIx32 " (%" B_PRId32 ")\n", frequency, divider, divider); data[0] = divider >> 8; data[1] = (uint8)divider; diff --git a/src/add-ons/kernel/drivers/dvb/cx23882/dvb_interface.c b/src/add-ons/kernel/drivers/dvb/cx23882/dvb_interface.c index 2213c77acb..2d3415eea3 100644 --- a/src/add-ons/kernel/drivers/dvb/cx23882/dvb_interface.c +++ b/src/add-ons/kernel/drivers/dvb/cx23882/dvb_interface.c @@ -95,7 +95,8 @@ interface_attach(void **cookie, const pci_info *info) // adjust PCI latency timer val = gPci->read_pci_config(device->pci_info->bus, device->pci_info->device, device->pci_info->function, PCI_latency, 1); - TRACE("PCI latency is %02lx, changing to %02x\n", val, PCI_LATENCY); + TRACE("PCI latency is %02" B_PRIx32 ", changing to %02x\n", val, + PCI_LATENCY); gPci->write_pci_config(device->pci_info->bus, device->pci_info->device, device->pci_info->function, PCI_latency, 1, PCI_LATENCY); // get IRQ @@ -113,8 +114,9 @@ interface_attach(void **cookie, const pci_info *info) dprintf("cx23882: Error, no memory space assigned\n"); goto err; } - TRACE("hardware register address %p\n", (void *) val); - device->regs_area = map_mem(&device->regs, (void *)val, 16777216 /* 16 MB */, 0, "cx23882 registers"); + TRACE("hardware register address 0x%" B_PRIx32 "\n", val); + device->regs_area = map_mem(&device->regs, (addr_t)val, + 16777216 /* 16 MB */, 0, "cx23882 registers"); if (device->regs_area < B_OK) { dprintf("cx23882: Error, can't map hardware registers\n"); goto err; diff --git a/src/add-ons/kernel/drivers/dvb/cx23882/util.c b/src/add-ons/kernel/drivers/dvb/cx23882/util.c index 77da6534c0..ceb0b623de 100644 --- a/src/add-ons/kernel/drivers/dvb/cx23882/util.c +++ b/src/add-ons/kernel/drivers/dvb/cx23882/util.c @@ -37,47 +37,49 @@ area_id -map_mem(void **virt, void *phy, size_t size, uint32 protection, +map_mem(void **virt, phys_addr_t phy, size_t size, uint32 protection, const char *name) { uint32 offset; - void *phyadr; + phys_addr_t phyadr; void *mapadr; area_id area; - TRACE("mapping physical address %p with %ld bytes for %s\n", phy, size, - name); + TRACE("mapping physical address %" B_PRIxPHYSADDR " with %ld bytes for %s\n", + phy, size, name); offset = (uint32)phy & (B_PAGE_SIZE - 1); - phyadr = (char *)phy - offset; + phyadr = phy - offset; size = ROUNDUP(size + offset, B_PAGE_SIZE); - area = map_physical_memory(name, (addr_t)phyadr, size, + area = map_physical_memory(name, phyadr, size, B_ANY_KERNEL_BLOCK_ADDRESS, protection, &mapadr); if (area < B_OK) { - TRACE("mapping '%s' failed, error 0x%lx (%s)\n", name, area, strerror(area)); + TRACE("mapping '%s' failed, error 0x%" B_PRIx32 " (%s)\n", name, area, + strerror(area)); return area; } *virt = (char *)mapadr + offset; - TRACE("physical = %p, virtual = %p, offset = %ld, phyadr = %p, mapadr = %p, size = %ld, area = 0x%08lx\n", - phy, *virt, offset, phyadr, mapadr, size, area); + TRACE("physical = %" B_PRIxPHYSADDR ", virtual = %p, offset = %" B_PRIu32 + ", phyadr = %" B_PRIxPHYSADDR ", mapadr = %p, size = %" B_PRIuSIZE + ", area = 0x%08" B_PRIx32 "\n", phy, *virt, offset, phyadr, mapadr, + size, area); return area; } area_id -alloc_mem(void **virt, void **phy, size_t size, uint32 protection, +alloc_mem(void **virt, phys_addr_t *phy, size_t size, uint32 protection, const char *name) { -// TODO: phy should be phys_addr_t*! physical_entry pe; void * virtadr; area_id areaid; status_t rv; - TRACE("allocating %ld bytes for %s\n", size, name); + TRACE("allocating %" B_PRIuSIZE " bytes for %s\n", size, name); size = ROUNDUP(size, B_PAGE_SIZE); areaid = create_area(name, &virtadr, B_ANY_KERNEL_ADDRESS, size, @@ -97,7 +99,8 @@ alloc_mem(void **virt, void **phy, size_t size, uint32 protection, if (virt) *virt = virtadr; if (phy) - *phy = (void*)(addr_t)pe.address; - TRACE("area = %ld, size = %ld, virt = %p, phy = %" B_PRIxPHYSADDR "\n", areaid, size, virtadr, pe.address); + *phy = pe.address; + TRACE("area = %" B_PRId32 ", size = %" B_PRIuSIZE ", virt = %p, phy = %" + B_PRIxPHYSADDR "\n", areaid, size, virtadr, pe.address); return areaid; } diff --git a/src/add-ons/kernel/drivers/dvb/cx23882/util.h b/src/add-ons/kernel/drivers/dvb/cx23882/util.h index 8df060ed7c..f6a25f01d1 100644 --- a/src/add-ons/kernel/drivers/dvb/cx23882/util.h +++ b/src/add-ons/kernel/drivers/dvb/cx23882/util.h @@ -27,8 +27,10 @@ #include -area_id map_mem(void **virt, void *phy, size_t size, uint32 protection, const char *name); -area_id alloc_mem(void **virt, void **phy, size_t size, uint32 protection, const char *name); +area_id map_mem(void **virt, phys_addr_t phy, size_t size, uint32 protection, + const char *name); +area_id alloc_mem(void **virt, phys_addr_t *phy, size_t size, uint32 protection, + const char *name); // generic macro for rounding, can only be used for power of 2 blocksize #define ROUNDUP(size, blocksize) (((size) + (blocksize) - 1) & ~((blocksize) - 1)) From 56dc5af7353d7ba5974a27f3e5d20652c53004e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 17:30:06 +0200 Subject: [PATCH 070/136] usb_davicom: fixes 64 bit warnings --- .../drivers/network/usb_davicom/DavicomDevice.cpp | 15 ++++++++------- .../drivers/network/usb_davicom/DavicomDevice.h | 6 +++--- .../kernel/drivers/network/usb_davicom/Driver.cpp | 2 +- .../drivers/network/usb_davicom/Settings.cpp | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp index 8cff098f32..9ceb5f987a 100644 --- a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp +++ b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp @@ -346,11 +346,12 @@ DavicomDevice::Write(const uint8 *buffer, size_t *numBytes) } struct _TXHeader { - uint countLow :8; - uint countHigh :8; + uint8 countLow; + uint8 countHigh; } __attribute__((__packed__)); - _TXHeader header = { length & 0xff, length >> 8 & 0xff }; + _TXHeader header = { (uint8)(length & 0xff), + (uint8)((length >> 8) & 0xff) }; uint8 padding = 0; @@ -821,7 +822,7 @@ DavicomDevice::_ModifyMulticastTable(bool join, ether_address_t *group) void DavicomDevice::_ReadCallback(void *cookie, int32 status, void *data, - uint32 actualLength) + size_t actualLength) { TRACE_RX("ReadCB: %d bytes; status:%#010x\n", actualLength, status); DavicomDevice *device = (DavicomDevice *)cookie; @@ -834,7 +835,7 @@ DavicomDevice::_ReadCallback(void *cookie, int32 status, void *data, void DavicomDevice::_WriteCallback(void *cookie, int32 status, void *data, - uint32 actualLength) + size_t actualLength) { TRACE_TX("WriteCB: %d bytes; status:%#010x\n", actualLength, status); DavicomDevice *device = (DavicomDevice *)cookie; @@ -847,7 +848,7 @@ DavicomDevice::_WriteCallback(void *cookie, int32 status, void *data, void DavicomDevice::_NotifyCallback(void *cookie, int32 status, void *data, - uint32 actualLength) + size_t actualLength) { DavicomDevice *device = (DavicomDevice *)cookie; atomic_add(&device->fInsideNotify, 1); @@ -1117,7 +1118,7 @@ DavicomDevice::_WriteMII(uint8 reg, uint16 data) } // put the value to data register - uint8 values[] = { data & 0xff, ( data >> 8 ) & 0xff }; + uint8 values[] = { (uint8)(data & 0xff), (uint8)((data >> 8) & 0xff) }; result = _WriteRegister(RegEPDRL, sizeof(uint16), values); if (result != B_OK) { TRACE_ALWAYS("Failed to put data %#x. Error:%#x\n", data, result); diff --git a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h index 4d94f5fb75..af0ce0e0de 100644 --- a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h +++ b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h @@ -123,11 +123,11 @@ public: private: static void _ReadCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + void *data, size_t actualLength); static void _WriteCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + void *data, size_t actualLength); static void _NotifyCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + void *data, size_t actualLength); status_t _SetupEndpoints(); diff --git a/src/add-ons/kernel/drivers/network/usb_davicom/Driver.cpp b/src/add-ons/kernel/drivers/network/usb_davicom/Driver.cpp index 1e85b40af7..cbbe356758 100644 --- a/src/add-ons/kernel/drivers/network/usb_davicom/Driver.cpp +++ b/src/add-ons/kernel/drivers/network/usb_davicom/Driver.cpp @@ -321,7 +321,7 @@ publish_devices() gDeviceNames[deviceCount] = (char *)malloc(strlen(sDeviceBaseName) + 4); if (gDeviceNames[deviceCount]) { - sprintf(gDeviceNames[deviceCount], "%s%ld", sDeviceBaseName, i); + sprintf(gDeviceNames[deviceCount], "%s%" B_PRId32, sDeviceBaseName, i); TRACE("publishing %s\n", gDeviceNames[deviceCount]); deviceCount++; } else diff --git a/src/add-ons/kernel/drivers/network/usb_davicom/Settings.cpp b/src/add-ons/kernel/drivers/network/usb_davicom/Settings.cpp index 3aaf213087..3e46e946e1 100644 --- a/src/add-ons/kernel/drivers/network/usb_davicom/Settings.cpp +++ b/src/add-ons/kernel/drivers/network/usb_davicom/Settings.cpp @@ -103,7 +103,7 @@ void usb_davicom_trace(bool force, const char* func, const char *fmt, ...) bigtime_t time = system_time(); uint32 msec = time / 1000; uint32 sec = msec / 1000; - sprintf(buf_ptr, "%02ld.%02ld.%03ld:", + sprintf(buf_ptr, "%02" B_PRId32 ".%02" B_PRId32 ".%03" B_PRId32 ":", sec / 60, sec % 60, msec % 1000); buf_ptr += strlen(buf_ptr); } From 19d7d464e52d32c788f5490dc45619961e50bc43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 17:33:27 +0200 Subject: [PATCH 071/136] usb_asix: fixes 64 bit warnings --- src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.cpp | 6 +++--- src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.h | 6 +++--- src/add-ons/kernel/drivers/network/usb_asix/Driver.cpp | 3 ++- src/add-ons/kernel/drivers/network/usb_asix/Settings.cpp | 3 ++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.cpp b/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.cpp index 49cd5803d2..19eb3580bd 100644 --- a/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.cpp +++ b/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.cpp @@ -700,7 +700,7 @@ ASIXDevice::ModifyMulticastTable(bool join, ether_address_t* group) void ASIXDevice::_ReadCallback(void *cookie, int32 status, void *data, - uint32 actualLength) + size_t actualLength) { TRACE_FLOW("ReadCB: %d bytes; status:%#010x\n", actualLength, status); ASIXDevice *device = (ASIXDevice *)cookie; @@ -712,7 +712,7 @@ ASIXDevice::_ReadCallback(void *cookie, int32 status, void *data, void ASIXDevice::_WriteCallback(void *cookie, int32 status, void *data, - uint32 actualLength) + size_t actualLength) { TRACE_FLOW("WriteCB: %d bytes; status:%#010x\n", actualLength, status); ASIXDevice *device = (ASIXDevice *)cookie; @@ -724,7 +724,7 @@ ASIXDevice::_WriteCallback(void *cookie, int32 status, void *data, void ASIXDevice::_NotifyCallback(void *cookie, int32 status, void *data, - uint32 actualLength) + size_t actualLength) { ASIXDevice *device = (ASIXDevice *)cookie; atomic_add(&device->fInsideNotify, 1); diff --git a/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.h b/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.h index e932a377ab..0bccbbfb68 100644 --- a/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.h +++ b/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.h @@ -64,11 +64,11 @@ virtual status_t SetupDevice(bool deviceReplugged); private: static void _ReadCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + void *data, size_t actualLength); static void _WriteCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + void *data, size_t actualLength); static void _NotifyCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + void *data, size_t actualLength); status_t _SetupEndpoints(); diff --git a/src/add-ons/kernel/drivers/network/usb_asix/Driver.cpp b/src/add-ons/kernel/drivers/network/usb_asix/Driver.cpp index e19f45ad6b..1a67009d7d 100644 --- a/src/add-ons/kernel/drivers/network/usb_asix/Driver.cpp +++ b/src/add-ons/kernel/drivers/network/usb_asix/Driver.cpp @@ -363,7 +363,8 @@ publish_devices() gDeviceNames[deviceCount] = (char *)malloc(strlen(sDeviceBaseName) + 4); if (gDeviceNames[deviceCount]) { - sprintf(gDeviceNames[deviceCount], "%s%ld", sDeviceBaseName, i); + sprintf(gDeviceNames[deviceCount], "%s%" B_PRId32, sDeviceBaseName, + i); TRACE("publishing %s\n", gDeviceNames[deviceCount]); deviceCount++; } else diff --git a/src/add-ons/kernel/drivers/network/usb_asix/Settings.cpp b/src/add-ons/kernel/drivers/network/usb_asix/Settings.cpp index 511ff1ad1e..5ac346e771 100644 --- a/src/add-ons/kernel/drivers/network/usb_asix/Settings.cpp +++ b/src/add-ons/kernel/drivers/network/usb_asix/Settings.cpp @@ -96,7 +96,8 @@ void usb_asix_trace(bool force, const char* func, const char *fmt, ...) bigtime_t time = system_time(); uint32 msec = time / 1000; uint32 sec = msec / 1000; - sprintf(buf_ptr, "%02ld.%02ld.%03ld:", sec / 60, sec % 60, msec % 1000); + sprintf(buf_ptr, "%02" B_PRId32 ".%02" B_PRId32 ".%03" B_PRId32 ":", + sec / 60, sec % 60, msec % 1000); buf_ptr += strlen(buf_ptr); } From 0e8bd8493ae1923bff0967989ab2fedcd5993f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 17:38:13 +0200 Subject: [PATCH 072/136] usb_ecm: fixes 64 bit warnings --- .../kernel/drivers/network/usb_ecm/Driver.cpp | 7 ++++--- .../kernel/drivers/network/usb_ecm/ECMDevice.cpp | 14 +++++++------- .../kernel/drivers/network/usb_ecm/ECMDevice.h | 6 +++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/usb_ecm/Driver.cpp b/src/add-ons/kernel/drivers/network/usb_ecm/Driver.cpp index b56daf0bcb..ac25820d04 100644 --- a/src/add-ons/kernel/drivers/network/usb_ecm/Driver.cpp +++ b/src/add-ons/kernel/drivers/network/usb_ecm/Driver.cpp @@ -38,7 +38,7 @@ usb_ecm_device_added(usb_device device, void **cookie) if (gECMDevices[i]->CompareAndReattach(device) != B_OK) continue; - TRACE_ALWAYS("ecm device %ld replugged\n", i); + TRACE_ALWAYS("ecm device %" B_PRId32 " replugged\n", i); *cookie = gECMDevices[i]; mutex_unlock(&gDriverLock); return B_OK; @@ -60,7 +60,7 @@ usb_ecm_device_added(usb_device device, void **cookie) gECMDevices[i] = ecmDevice; *cookie = ecmDevice; - TRACE_ALWAYS("ecm device %ld added\n", i); + TRACE_ALWAYS("ecm device %" B_PRId32 " added\n", i); mutex_unlock(&gDriverLock); return B_OK; } @@ -258,7 +258,8 @@ publish_devices() gDeviceNames[deviceCount] = (char *)malloc(strlen(sDeviceBaseName) + 4); if (gDeviceNames[deviceCount]) { - sprintf(gDeviceNames[deviceCount], "%s%ld", sDeviceBaseName, i); + sprintf(gDeviceNames[deviceCount], "%s%" B_PRId32, sDeviceBaseName, + i); TRACE("publishing %s\n", gDeviceNames[deviceCount]); deviceCount++; } else diff --git a/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.cpp b/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.cpp index 04c7adaa11..f9f00928ed 100644 --- a/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.cpp +++ b/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.cpp @@ -195,7 +195,7 @@ ECMDevice::Read(uint8 *buffer, size_t *numBytes) } if (fStatusRead != B_OK && fStatusRead != B_CANCELED && !fRemoved) { - TRACE_ALWAYS("device status error 0x%08lx\n", fStatusRead); + TRACE_ALWAYS("device status error 0x%08" B_PRIx32 "\n", fStatusRead); result = gUSBModule->clear_feature(fReadEndpoint, USB_FEATURE_ENDPOINT_HALT); if (result != B_OK) { @@ -232,7 +232,7 @@ ECMDevice::Write(const uint8 *buffer, size_t *numBytes) } if (fStatusWrite != B_OK && fStatusWrite != B_CANCELED && !fRemoved) { - TRACE_ALWAYS("device status error 0x%08lx\n", fStatusWrite); + TRACE_ALWAYS("device status error 0x%08" B_PRIx32 "\n", fStatusWrite); result = gUSBModule->clear_feature(fWriteEndpoint, USB_FEATURE_ENDPOINT_HALT); if (result != B_OK) { @@ -279,7 +279,7 @@ ECMDevice::Control(uint32 op, void *buffer, size_t length) #endif default: - TRACE_ALWAYS("unsupported ioctl %lu\n", op); + TRACE_ALWAYS("unsupported ioctl %" B_PRIu32 "\n", op); } return B_DEV_INVALID_IOCTL; @@ -506,7 +506,7 @@ ECMDevice::_ReadMACAddress(usb_device device, uint8 *buffer) void ECMDevice::_ReadCallback(void *cookie, int32 status, void *data, - uint32 actualLength) + size_t actualLength) { ECMDevice *device = (ECMDevice *)cookie; device->fActualLengthRead = actualLength; @@ -517,7 +517,7 @@ ECMDevice::_ReadCallback(void *cookie, int32 status, void *data, void ECMDevice::_WriteCallback(void *cookie, int32 status, void *data, - uint32 actualLength) + size_t actualLength) { ECMDevice *device = (ECMDevice *)cookie; device->fActualLengthWrite = actualLength; @@ -528,7 +528,7 @@ ECMDevice::_WriteCallback(void *cookie, int32 status, void *data, void ECMDevice::_NotifyCallback(void *cookie, int32 status, void *data, - uint32 actualLength) + size_t actualLength) { ECMDevice *device = (ECMDevice *)cookie; atomic_add(&device->fInsideNotify, 1); @@ -580,7 +580,7 @@ ECMDevice::_NotifyCallback(void *cookie, int32 status, void *data, } if (status != B_OK) { - TRACE_ALWAYS("device status error 0x%08lx\n", status); + TRACE_ALWAYS("device status error 0x%08" B_PRIx32 "\n", status); if (gUSBModule->clear_feature(device->fNotifyEndpoint, USB_FEATURE_ENDPOINT_HALT) != B_OK) TRACE_ALWAYS("failed to clear halt state in notify hook\n"); diff --git a/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.h b/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.h index 3a6801a4ea..2cc5b266d0 100644 --- a/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.h +++ b/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.h @@ -32,11 +32,11 @@ public: private: static void _ReadCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + void *data, size_t actualLength); static void _WriteCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + void *data, size_t actualLength); static void _NotifyCallback(void *cookie, int32 status, - void *data, uint32 actualLength); + void *data, size_t actualLength); status_t _SetupDevice(); status_t _ReadMACAddress(usb_device device, uint8 *buffer); From 24dba16d04b9acd835871de8f9066c8874948e54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 17:40:35 +0200 Subject: [PATCH 073/136] usb_serial: fixes 64 bit warnings --- src/add-ons/kernel/drivers/ports/usb_serial/Driver.cpp | 2 +- .../kernel/drivers/ports/usb_serial/SerialDevice.cpp | 6 +++--- src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.h | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/add-ons/kernel/drivers/ports/usb_serial/Driver.cpp b/src/add-ons/kernel/drivers/ports/usb_serial/Driver.cpp index 77f9f74643..fb88813c9e 100644 --- a/src/add-ons/kernel/drivers/ports/usb_serial/Driver.cpp +++ b/src/add-ons/kernel/drivers/ports/usb_serial/Driver.cpp @@ -351,7 +351,7 @@ publish_devices() if (gSerialDevices[i]) { gDeviceNames[j] = (char *)malloc(strlen(sDeviceBaseName) + 4); if (gDeviceNames[j]) { - sprintf(gDeviceNames[j], "%s%ld", sDeviceBaseName, i); + sprintf(gDeviceNames[j], "%s%" B_PRId32, sDeviceBaseName, i); j++; } else TRACE_ALWAYS("publish_devices - no memory to allocate device names\n"); diff --git a/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.cpp b/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.cpp index e8bb192c35..4af8c16a30 100644 --- a/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.cpp +++ b/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.cpp @@ -669,7 +669,7 @@ SerialDevice::_WriteToDevice() void SerialDevice::_ReadCallbackFunction(void *cookie, status_t status, void *data, - uint32 actualLength) + size_t actualLength) { TRACE_FUNCALLS("read callback: cookie: 0x%08x status: 0x%08x data: 0x%08x " "length: %lu\n", cookie, status, data, actualLength); @@ -683,7 +683,7 @@ SerialDevice::_ReadCallbackFunction(void *cookie, status_t status, void *data, void SerialDevice::_WriteCallbackFunction(void *cookie, status_t status, void *data, - uint32 actualLength) + size_t actualLength) { TRACE_FUNCALLS("write callback: cookie: 0x%08x status: 0x%08x data: 0x%08x " "length: %lu\n", cookie, status, data, actualLength); @@ -697,7 +697,7 @@ SerialDevice::_WriteCallbackFunction(void *cookie, status_t status, void *data, void SerialDevice::_InterruptCallbackFunction(void *cookie, status_t status, - void *data, uint32 actualLength) + void *data, size_t actualLength) { TRACE_FUNCALLS("interrupt callback: cookie: 0x%08x status: 0x%08x data: " "0x%08x len: %lu\n", cookie, status, data, actualLength); diff --git a/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.h b/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.h index 57afc10cb7..213e2556d8 100644 --- a/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.h +++ b/src/add-ons/kernel/drivers/ports/usb_serial/SerialDevice.h @@ -95,13 +95,13 @@ static int32 _InputThread(void *data); static void _ReadCallbackFunction(void *cookie, int32 status, void *data, - uint32 actualLength); + size_t actualLength); static void _WriteCallbackFunction(void *cookie, int32 status, void *data, - uint32 actualLength); + size_t actualLength); static void _InterruptCallbackFunction(void *cookie, int32 status, void *data, - uint32 actualLength); + size_t actualLength); usb_device fDevice; // USB device handle uint16 fVendorID; From 01c5671de87bbecdcbcb06ab88ce1b240a78a58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 9 May 2013 18:11:19 +0200 Subject: [PATCH 074/136] midi kit, media_addon_server, mail_server: fixes 64 bit warnings --- src/kits/midi/MidiText.cpp | 2 +- src/servers/mail/ErrorLogWindow.cpp | 2 +- src/servers/media_addon/MediaAddonServer.cpp | 25 ++++++++++---------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/kits/midi/MidiText.cpp b/src/kits/midi/MidiText.cpp index 2ce838f779..c3f5037aaa 100644 --- a/src/kits/midi/MidiText.cpp +++ b/src/kits/midi/MidiText.cpp @@ -164,6 +164,6 @@ BMidiText::_WaitAndPrint(uint32 time) SnoozeUntil(time); - printf("%lu: ", time - fStartTime); + printf("%" B_PRIu32 ": ", time - fStartTime); } diff --git a/src/servers/mail/ErrorLogWindow.cpp b/src/servers/mail/ErrorLogWindow.cpp index 0cdeddba9e..f4ddea9755 100644 --- a/src/servers/mail/ErrorLogWindow.cpp +++ b/src/servers/mail/ErrorLogWindow.cpp @@ -208,7 +208,7 @@ Error::GetPreferredSize(float *width, float *height) BTextView *view = static_cast(FindView("error_display")); *width = view->Frame().Width() + 20; - *height = view->TextHeight(0, LONG_MAX) + 3; + *height = view->TextHeight(0, INT32_MAX) + 3; } diff --git a/src/servers/media_addon/MediaAddonServer.cpp b/src/servers/media_addon/MediaAddonServer.cpp index 19554c8984..a644f584dd 100644 --- a/src/servers/media_addon/MediaAddonServer.cpp +++ b/src/servers/media_addon/MediaAddonServer.cpp @@ -426,8 +426,8 @@ MediaAddonServer::_HandleMessage(int32 code, const void* data, size_t size) break; default: - ERROR("media_addon_server: received unknown message code %#08lx\n", - code); + ERROR("media_addon_server: received unknown message code %#08" + B_PRIx32 "\n", code); break; } } @@ -605,13 +605,14 @@ MediaAddonServer::_AddOnAdded(const char* path, ino_t fileNode) void MediaAddonServer::_DestroyInstantiatedFlavors(AddOnInfo& info) { - printf("MediaAddonServer::_DestroyInstantiatedFlavors addon %ld\n", info.id); + printf("MediaAddonServer::_DestroyInstantiatedFlavors addon %" B_PRId32 + "\n", info.id); NodeVector::iterator iterator = info.active_flavors.begin(); for (; iterator != info.active_flavors.end(); iterator++) { media_node& node = *iterator; - printf("node %ld\n", node.node); + printf("node %" B_PRId32 "\n", node.node); if ((node.kind & B_TIME_SOURCE) != 0 && (fMediaRoster->StopTimeSource(node, 0, true) != B_OK)) { @@ -709,7 +710,7 @@ MediaAddonServer::_InstantiatePhysicalInputsAndOutputs(AddOnInfo& info) const flavor_info* flavorinfo; if (info.addon->GetFlavorAt(i, &flavorinfo) != B_OK) { ERROR("MediaAddonServer::InstantiatePhysialInputsAndOutputs " - "GetFlavorAt failed for index %ld!\n", i); + "GetFlavorAt failed for index %" B_PRId32 "!\n", i); continue; } if ((flavorinfo->kinds & (B_PHYSICAL_INPUT | B_PHYSICAL_OUTPUT)) != 0) { @@ -726,8 +727,8 @@ MediaAddonServer::_InstantiatePhysicalInputsAndOutputs(AddOnInfo& info) dormantNodeInfo, &node); if (status != B_OK) { ERROR("MediaAddonServer::InstantiatePhysialInputsAndOutputs " - "Couldn't instantiate node flavor, internal_id %ld, " - "name %s\n", flavorinfo->internal_id, flavorinfo->name); + "Couldn't instantiate node flavor, internal_id %" B_PRId32 + ", name %s\n", flavorinfo->internal_id, flavorinfo->name); } else { TRACE("Node created!\n"); info.active_flavors.push_back(node); @@ -756,12 +757,12 @@ MediaAddonServer::_InstantiateAutostartFlavors(AddOnInfo& info) else if (status != B_OK) break; - printf("started node %ld\n", index); + printf("started node %" B_PRId32 "\n", index); status = MediaRosterEx(fMediaRoster)->RegisterNode(node, info.id, internalID); if (status != B_OK) { - ERROR("failed to register node %ld\n", index); + ERROR("failed to register node %" B_PRId32 "\n", index); node->Release(); } else { MediaRosterEx(fMediaRoster)->IncrementAddonFlavorInstancesCount( @@ -782,7 +783,7 @@ MediaAddonServer::_AddOnRemoved(ino_t fileNode) FileMap::iterator foundFile = fFileMap.find(fileNode); if (foundFile == fFileMap.end()) { - ERROR("MediaAddonServer::_AddOnRemoved: inode %Ld removed, but no " + ERROR("MediaAddonServer::_AddOnRemoved: inode %" B_PRIdINO " removed, but no " "media add-on found\n", fileNode); return; } @@ -795,7 +796,7 @@ MediaAddonServer::_AddOnRemoved(ino_t fileNode) if (foundInfo == fInfoMap.end()) { ERROR("MediaAddonServer::_AddOnRemoved: couldn't get addon info for " - "add-on %ld\n", id); + "add-on %" B_PRId32 "\n", id); oldFlavorCount = 1000; } else { AddOnInfo& info = foundInfo->second; @@ -806,7 +807,7 @@ MediaAddonServer::_AddOnRemoved(ino_t fileNode) if (info.addon) { ERROR("MediaAddonServer::_AddOnRemoved: couldn't unload addon " - "%ld since flavors are in use\n", id); + "%" B_PRId32 " since flavors are in use\n", id); } fInfoMap.erase(foundInfo); From 2b67ff24207110739a9c52e1a659775bfb8be432 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Thu, 9 May 2013 21:27:43 +0200 Subject: [PATCH 075/136] Add AddText method to AboutWindow * Factor out the code to add some data to the about window, with a header and a content under it * Make this method public so it's possible to add custom entries in an about box * If the method is called with only the header or only the content, the text is added non-bold and non-indented (like the description entry*). * Make the header text bold. I'm not sure it looks that good, after all. Thoughts ? --- headers/private/shared/AboutWindow.h | 3 ++ src/kits/shared/AboutWindow.cpp | 76 ++++++++++++++-------------- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/headers/private/shared/AboutWindow.h b/headers/private/shared/AboutWindow.h index a8ec0b58fa..9a3cc60576 100644 --- a/headers/private/shared/AboutWindow.h +++ b/headers/private/shared/AboutWindow.h @@ -37,6 +37,9 @@ class BAboutWindow : public BWindow { void AddVersionHistory(const char** history); void AddExtraInfo(const char* extraInfo); + void AddText(const char* header, + const char** contents = NULL); + BBitmap* Icon(); void SetIcon(BBitmap* icon); diff --git a/src/kits/shared/AboutWindow.cpp b/src/kits/shared/AboutWindow.cpp index 0b81b02dce..2d66bfcebf 100644 --- a/src/kits/shared/AboutWindow.cpp +++ b/src/kits/shared/AboutWindow.cpp @@ -176,6 +176,7 @@ AboutView::AboutView(const char* appName, const char* signature) fInfoView->SetInsets(5.0, 5.0, 5.0, 5.0); fInfoView->SetViewColor(ui_color(B_DOCUMENT_BACKGROUND_COLOR)); fInfoView->SetHighColor(ui_color(B_DOCUMENT_TEXT_COLOR)); + fInfoView->SetStylable(true); BScrollView* infoViewScroller = new BScrollView( "infoViewScroller", fInfoView, B_WILL_DRAW | B_FRAME_EVENTS, @@ -435,16 +436,7 @@ BAboutWindow::AddDescription(const char* description) if (description == NULL) return; - const char* appDesc = B_TRANSLATE_MARK(description); - appDesc = gSystemCatalog.GetString(appDesc, "AboutWindow"); - - BString desc(""); - if (fAboutView->InfoView()->TextLength() > 0) - desc << "\n\n"; - - desc << appDesc; - - fAboutView->InfoView()->Insert(desc.String()); + AddText(description); } @@ -501,16 +493,7 @@ BAboutWindow::AddAuthors(const char** authors) const char* writtenBy = B_TRANSLATE_MARK("Written by:"); writtenBy = gSystemCatalog.GetString(writtenBy, "AboutWindow"); - BString text(""); - if (fAboutView->InfoView()->TextLength() > 0) - text << "\n\n"; - - text << writtenBy; - text << "\n"; - for (int32 i = 0; authors[i]; i++) - text << " " << authors[i] << "\n"; - - fAboutView->InfoView()->Insert(text.String()); + AddText(writtenBy, authors); } @@ -523,15 +506,7 @@ BAboutWindow::AddSpecialThanks(const char** thanks) const char* specialThanks = B_TRANSLATE_MARK("Special Thanks:"); specialThanks = gSystemCatalog.GetString(specialThanks, "AboutWindow"); - BString text(""); - if (fAboutView->InfoView()->TextLength() > 0) - text << "\n\n"; - - text << specialThanks << "\n"; - for (int32 i = 0; thanks[i]; i++) - text << " " << thanks[i] << "\n"; - - fAboutView->InfoView()->Insert(text.String()); + AddText(specialThanks, thanks); } @@ -544,15 +519,7 @@ BAboutWindow::AddVersionHistory(const char** history) const char* versionHistory = B_TRANSLATE_MARK("Version history:"); versionHistory = gSystemCatalog.GetString(versionHistory, "AboutWindow"); - BString text(""); - if (fAboutView->InfoView()->TextLength() > 0) - text << "\n\n"; - - text << versionHistory << "\n"; - for (int32 i = 0; history[i]; i++) - text << " " << history[i] << "\n"; - - fAboutView->InfoView()->Insert(text.String()); + AddText(versionHistory, history); } @@ -575,6 +542,39 @@ BAboutWindow::AddExtraInfo(const char* extraInfo) } +void +BAboutWindow::AddText(const char* header, const char** contents) +{ + BTextView* infoView = fAboutView->InfoView(); + int32 textLength = infoView->TextLength(); + BString text(""); + + if (textLength > 0) { + text << "\n\n"; + textLength += 2; + } + + const char* indent = ""; + if (header != NULL) { + indent = " "; + text << header; + } + + if (contents != NULL) { + text << "\n"; + for (int32 i = 0; contents[i]; i++) + text << indent << contents[i] << "\n"; + } + + infoView->Insert(text.String()); + + if (contents != NULL && header != NULL) { + infoView->SetFontAndColor(textLength, textLength + strlen(header), + be_bold_font); + } +} + + const char* BAboutWindow::Name() { From 331349203211eb54d6f22202197b73e13088a1ac Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Thu, 9 May 2013 17:31:04 -0400 Subject: [PATCH 076/136] Fix memory leaks introduced in previous commits. --- .../gui/team_window/ImageFunctionsView.cpp | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp index f3088689c4..017c9e436b 100644 --- a/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/ImageFunctionsView.cpp @@ -37,8 +37,6 @@ public: fSourceFile(sourceFile), fFunction(function) { - if (fParent != NULL) - fParent->AcquireReference(); if (fSourceFile != NULL) fSourceFile->AcquireReference(); if (fFunction != NULL) @@ -50,14 +48,11 @@ public: for (int32 i = 0; i < fChildPathComponents.CountItems(); i++) fChildPathComponents.ItemAt(i)->ReleaseReference(); - if (fParent != NULL) - fParent->ReleaseReference(); - if (fSourceFile != NULL) fSourceFile->ReleaseReference(); if (fFunction != NULL) - fFunction->AcquireReference(); + fFunction->ReleaseReference(); } const BString& ComponentName() const @@ -223,8 +218,8 @@ public: SourcePathComponentNode* sourcelessNode = new(std::nothrow) SourcePathComponentNode(NULL, "", NULL, NULL); - ObjectDeleter sourceNodeDeleter( - sourcelessNode); + BReference sourceNodeRef( + sourcelessNode, true); for (int32 i = 0; i < functionCount; i++) { @@ -236,7 +231,7 @@ public: if (fChildPathComponents.BinaryInsert(sourcelessNode, &SourcePathComponentNode::CompareComponents)) { fSourcelessNode = sourcelessNode; - sourceNodeDeleter.Detach(); + sourceNodeRef.Detach(); } } @@ -404,7 +399,8 @@ private: pathComponent, NULL, NULL); if (currentNode == NULL) return false; - ObjectDeleter nodeDeleter(currentNode); + BReference nodeReference(currentNode, + true); if (parent != NULL) { if (!parent->AddChild(currentNode)) return false; @@ -413,8 +409,9 @@ private: &SourcePathComponentNode::CompareComponents)) { return false; } + + nodeReference.Detach(); } - nodeDeleter.Detach(); } if (pathSeparatorIndex == -1) @@ -433,12 +430,10 @@ private: if (functionNode == NULL) return B_NO_MEMORY; - ObjectDeleter nodeDeleter(functionNode); - + BReference nodeReference(functionNode, true); if (!parent->AddChild(functionNode)) return false; - nodeDeleter.Detach(); return true; } From 935599c53fd1d65a18fe6057dfbcd8f6de7437ca Mon Sep 17 00:00:00 2001 From: John Scipione Date: Wed, 8 May 2013 20:37:06 -0400 Subject: [PATCH 077/136] Revert "Info: Set fixed size true for pref app menu field" This reverts commit 879020baf11d142a48ba1714fcca1c419b93a4c3. --- src/kits/tracker/InfoWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kits/tracker/InfoWindow.cpp b/src/kits/tracker/InfoWindow.cpp index 9b09b0b369..f07c50342a 100644 --- a/src/kits/tracker/InfoWindow.cpp +++ b/src/kits/tracker/InfoWindow.cpp @@ -921,7 +921,7 @@ AttributeView::AttributeView(BRect rect, Model* model) fTitleRect.bottom + (lineHeight * 7), Bounds().Width() - 5, fTitleRect.bottom + (lineHeight * 8)); fPreferredAppMenu = new BMenuField(preferredAppRect, "", "", - new BPopUpMenu(""), true); + new BPopUpMenu("")); fDivider = currentFont.StringWidth(B_TRANSLATE("Opens with:")) + 5; fPreferredAppMenu->SetDivider(fDivider); From df5d08a718644b1f6b718b6587ffe2fa4aacb5c2 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Thu, 9 May 2013 12:15:14 -0400 Subject: [PATCH 078/136] Style fixes to BMenuField Rename resize to resizingMode, whitespace fixes, compare to 0 explicitly --- headers/os/interface/MenuField.h | 24 +++++++++++++----------- src/kits/interface/MenuField.cpp | 15 +++++++-------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/headers/os/interface/MenuField.h b/headers/os/interface/MenuField.h index d58cd7a148..63cdb011df 100644 --- a/headers/os/interface/MenuField.h +++ b/headers/os/interface/MenuField.h @@ -16,12 +16,14 @@ class BMenuField : public BView { public: BMenuField(BRect frame, const char* name, const char* label, BMenu* menu, - uint32 resize = B_FOLLOW_LEFT|B_FOLLOW_TOP, + uint32 resizingMode = B_FOLLOW_LEFT + | B_FOLLOW_TOP, uint32 flags = B_WILL_DRAW | B_NAVIGABLE); BMenuField(BRect frame, const char* name, const char* label, BMenu* menu, bool fixed_size, - uint32 resize = B_FOLLOW_LEFT|B_FOLLOW_TOP, + uint32 resizingMode = B_FOLLOW_LEFT + | B_FOLLOW_TOP, uint32 flags = B_WILL_DRAW | B_NAVIGABLE); BMenuField(const char* name, const char* label, BMenu* menu, @@ -41,8 +43,8 @@ public: virtual void MouseDown(BPoint where); virtual void KeyDown(const char* bytes, int32 numBytes); virtual void MakeFocus(bool state); - virtual void MessageReceived(BMessage* message); - virtual void WindowActivated(bool state); + virtual void MessageReceived(BMessage* message); + virtual void WindowActivated(bool state); virtual void MouseUp(BPoint where); virtual void MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage); @@ -58,7 +60,7 @@ public: virtual void SetLabel(const char* label); const char* Label() const; - virtual void SetEnabled(bool on); + virtual void SetEnabled(bool on); bool IsEnabled() const; virtual void SetAlignment(alignment label); @@ -69,13 +71,13 @@ public: void ShowPopUpMarker(); void HidePopUpMarker(); - virtual BHandler* ResolveSpecifier(BMessage* message, + virtual BHandler* ResolveSpecifier(BMessage* message, int32 index, BMessage* specifier, int32 form, const char* property); - virtual status_t GetSupportedSuites(BMessage* data); + virtual status_t GetSupportedSuites(BMessage* data); - virtual void ResizeToPreferred(); - virtual void GetPreferredSize(float* width, float* height); + virtual void ResizeToPreferred(); + virtual void GetPreferredSize(float* width, float* height); virtual BSize MinSize(); virtual BSize MaxSize(); @@ -87,8 +89,8 @@ public: virtual status_t Perform(perform_code d, void* arg); protected: - virtual status_t AllArchived(BMessage* into) const; - virtual status_t AllUnarchived(const BMessage* from); + virtual status_t AllArchived(BMessage* into) const; + virtual status_t AllUnarchived(const BMessage* from); virtual void LayoutInvalidated(bool descendants); virtual void DoLayout(); diff --git a/src/kits/interface/MenuField.cpp b/src/kits/interface/MenuField.cpp index d82affed63..d401d63dca 100644 --- a/src/kits/interface/MenuField.cpp +++ b/src/kits/interface/MenuField.cpp @@ -135,9 +135,9 @@ static float kVMargin = 2.0f; BMenuField::BMenuField(BRect frame, const char* name, const char* label, - BMenu* menu, uint32 resize, uint32 flags) + BMenu* menu, uint32 resizingMode, uint32 flags) : - BView(frame, name, resize, flags) + BView(frame, name, resizingMode, flags) { CALLED(); @@ -153,9 +153,9 @@ BMenuField::BMenuField(BRect frame, const char* name, const char* label, BMenuField::BMenuField(BRect frame, const char* name, const char* label, - BMenu* menu, bool fixedSize, uint32 resize, uint32 flags) + BMenu* menu, bool fixedSize, uint32 resizingMode, uint32 flags) : - BView(frame, name, resize, flags) + BView(frame, name, resizingMode, flags) { InitObject(label); @@ -169,7 +169,7 @@ BMenuField::BMenuField(BRect frame, const char* name, const char* label, BMenuField::BMenuField(const char* name, const char* label, BMenu* menu, - uint32 flags) + uint32 flags) : BView(name, flags | B_FRAME_EVENTS) { @@ -637,7 +637,7 @@ BMenuField::SetDivider(float divider) fDivider = divider; - if (Flags() & B_SUPPORTS_LAYOUT) { + if ((Flags() & B_SUPPORTS_LAYOUT) != 0) { // We should never get here, since layout support means, we also // layout the divider, and don't use this method at all. Relayout(); @@ -882,7 +882,7 @@ void BMenuField::DoLayout() { // Bail out, if we shan't do layout. - if (!(Flags() & B_SUPPORTS_LAYOUT)) + if ((Flags() & B_SUPPORTS_LAYOUT) == 0) return; CALLED(); @@ -1137,7 +1137,6 @@ BMenuField::_InitMenuBar(BMenu* menu, BRect frame, bool fixedSize) AddChild(fMenuBar); fMenuBar->AddItem(menu); - fMenuBar->SetFont(be_plain_font); } From 91810d8efdaa9542d10d48976255cdde3b392bf5 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Thu, 9 May 2013 20:52:14 -0400 Subject: [PATCH 079/136] Use better variable names in SetDivider --- headers/os/interface/MenuField.h | 2 +- src/kits/interface/MenuField.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/headers/os/interface/MenuField.h b/headers/os/interface/MenuField.h index 63cdb011df..9e0a75753c 100644 --- a/headers/os/interface/MenuField.h +++ b/headers/os/interface/MenuField.h @@ -65,7 +65,7 @@ public: virtual void SetAlignment(alignment label); alignment Alignment() const; - virtual void SetDivider(float dividing_line); + virtual void SetDivider(float position); float Divider() const; void ShowPopUpMarker(); diff --git a/src/kits/interface/MenuField.cpp b/src/kits/interface/MenuField.cpp index d401d63dca..1efe3c5894 100644 --- a/src/kits/interface/MenuField.cpp +++ b/src/kits/interface/MenuField.cpp @@ -626,16 +626,16 @@ BMenuField::Alignment() const void -BMenuField::SetDivider(float divider) +BMenuField::SetDivider(float position) { - divider = floorf(divider + 0.5); + position = floorf(position + 0.5); - float dx = fDivider - divider; + float delta = fDivider - position; - if (dx == 0.0f) + if (delta == 0.0f) return; - fDivider = divider; + fDivider = position; if ((Flags() & B_SUPPORTS_LAYOUT) != 0) { // We should never get here, since layout support means, we also From 869e4bdca3701ec27feebab9ccf4be8c847a4ed7 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Thu, 9 May 2013 20:52:51 -0400 Subject: [PATCH 080/136] Don't cast to float, use floorf --- src/kits/interface/MenuField.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kits/interface/MenuField.cpp b/src/kits/interface/MenuField.cpp index 1efe3c5894..0af3cf2d51 100644 --- a/src/kits/interface/MenuField.cpp +++ b/src/kits/interface/MenuField.cpp @@ -956,7 +956,7 @@ BMenuField::InitObject(const char* label) SetLabel(label); if (label) - fDivider = (float)floor(Frame().Width() / 2.0f); + fDivider = floorf(Frame().Width() / 2.0f); else fDivider = 0; } From f6d93b80f34f14a2dc2b329e1e65cc5ca2c3de96 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Thu, 9 May 2013 20:54:58 -0400 Subject: [PATCH 081/136] Remove the unused bounds parameter from DrawLabel Also refactor BMenuField::Draw() --- headers/os/interface/MenuField.h | 2 +- src/kits/interface/MenuField.cpp | 17 +++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/headers/os/interface/MenuField.h b/headers/os/interface/MenuField.h index 9e0a75753c..aaf3cdfd5c 100644 --- a/headers/os/interface/MenuField.h +++ b/headers/os/interface/MenuField.h @@ -123,7 +123,7 @@ private: void InitObject(const char* label); void InitObject2(); - void DrawLabel(BRect bounds, BRect updateRect); + void DrawLabel(BRect updateRect); static void InitMenu(BMenu* menu); int32 _MenuTask(); diff --git a/src/kits/interface/MenuField.cpp b/src/kits/interface/MenuField.cpp index 0af3cf2d51..cdfe7477f7 100644 --- a/src/kits/interface/MenuField.cpp +++ b/src/kits/interface/MenuField.cpp @@ -356,22 +356,19 @@ BMenuField::AllUnarchived(const BMessage* from) void BMenuField::Draw(BRect updateRect) { - BRect bounds(Bounds()); - bool active = IsFocus() && Window()->IsActive(); + DrawLabel(updateRect); - DrawLabel(bounds, updateRect); - - BRect frame(fMenuBar->Frame()); - - frame.InsetBy(-kVMargin, -kVMargin); + BRect rect(fMenuBar->Frame()); + rect.InsetBy(-kVMargin, -kVMargin); rgb_color base = fMenuBar->LowColor(); rgb_color background = LowColor(); uint32 flags = 0; if (!fMenuBar->IsEnabled()) flags |= BControlLook::B_DISABLED; - if (active) + if (IsFocus() && Window()->IsActive()) flags |= BControlLook::B_FOCUSED; - be_control_look->DrawMenuFieldFrame(this, frame, updateRect, base, + + be_control_look->DrawMenuFieldFrame(this, rect, updateRect, base, background, flags); } @@ -981,7 +978,7 @@ BMenuField::InitObject2() void -BMenuField::DrawLabel(BRect bounds, BRect updateRect) +BMenuField::DrawLabel(BRect updateRect) { CALLED(); From 298cd4c2bffa793e9d17f22f5d2d6f49c3d07a73 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Thu, 9 May 2013 21:26:36 -0400 Subject: [PATCH 082/136] BMenuField: Fix menu bar resizing in auto-size mode. Fixes #9753 (for real this time) Don't resize the menu field when the menu bar resizes, the menu field stays the same size because we'll need to use it's width to check when the menu bar width has expanded beyond its width. Then, if the selected menu item expands the menu bar to a width greater than the width of the menu field resize it to the menu field width. --- src/kits/interface/BMCPrivate.cpp | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/kits/interface/BMCPrivate.cpp b/src/kits/interface/BMCPrivate.cpp index 6dc16759fd..f1dde0267d 100644 --- a/src/kits/interface/BMCPrivate.cpp +++ b/src/kits/interface/BMCPrivate.cpp @@ -137,12 +137,10 @@ _BMCMenuBar_::AttachedToWindow() void _BMCMenuBar_::Draw(BRect updateRect) { - if (fFixedSize) { - float height; - GetPreferredSize(NULL, &height); - ResizeTo(fMenuField->_MenuBarWidth(), height); - // Set the width to the menu field width because the menubar - // bounds are expanded by the selected menu item. + if (fFixedSize || Bounds().Width() > fMenuField->_MenuBarWidth()) { + // Set the width of the menu bar because the menu bar bounds have + // been expanded by the selected menu item. + ResizeTo(fMenuField->_MenuBarWidth(), Bounds().Height()); } BRect rect(Bounds()); rgb_color base = ui_color(B_MENU_BACKGROUND_COLOR); @@ -195,15 +193,6 @@ _BMCMenuBar_::FrameResized(float width, float height) } } - if (!fFixedSize && ResizingMode() == (B_FOLLOW_LEFT | B_FOLLOW_TOP)) { - // we have been shrinked or enlarged and need to take care - // of the size of the parent menu field as well - // NOTE: no worries about follow mode, we follow left and top - // in autosize mode - diff = Frame().right + 2 - fMenuField->Bounds().right; - fMenuField->ResizeBy(diff, 0.0); - } - BMenuBar::FrameResized(width, height); } From 55067dfe82790c537119b1137072ec738dbd7024 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Fri, 10 May 2013 00:51:24 -0400 Subject: [PATCH 083/136] Style fixes and update copywrite headers --- src/apps/terminal/FindWindow.cpp | 11 ++++++++--- src/apps/terminal/FindWindow.h | 4 ++-- src/apps/terminal/TermWindow.cpp | 1 + 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/apps/terminal/FindWindow.cpp b/src/apps/terminal/FindWindow.cpp index 181ddf2f69..dda76db5e3 100644 --- a/src/apps/terminal/FindWindow.cpp +++ b/src/apps/terminal/FindWindow.cpp @@ -1,8 +1,11 @@ /* - * Copyright 2007-2010, Haiku, Inc. All rights reserved. + * Copyright 2007-2013 Haiku, Inc. All rights reserved. * Copyright 2003-2004 Kian Duffy, myob@users.sourceforge.net * Parts Copyright 1998-1999 Kazuho Okui and Takashi Murai. * All rights reserved. Distributed under the terms of the MIT license. + * + * Authors: + * John Scipione, jscipione@gmail.com */ #include "FindWindow.h" @@ -26,11 +29,13 @@ const uint32 MSG_FIND_HIDE = 'Fhid'; const uint32 TOGGLE_FIND_CONTROL = 'MTFG'; const BRect kWindowFrame(10, 30, 250, 200); + #undef B_TRANSLATION_CONTEXT #define B_TRANSLATION_CONTEXT "Terminal FindWindow" + FindWindow::FindWindow(BMessenger messenger, const BString& str, - bool findSelection, bool matchWord, bool matchCase, bool forwardSearch) + bool findSelection, bool matchWord, bool matchCase, bool forwardSearch) : BWindow(kWindowFrame, B_TRANSLATE("Find"), B_FLOATING_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_CLOSE_ON_ESCAPE @@ -39,7 +44,7 @@ FindWindow::FindWindow(BMessenger messenger, const BString& str, { SetLayout(new BGroupLayout(B_VERTICAL)); - BBox *separator = new BBox("separator"); + BBox* separator = new BBox("separator"); separator->SetExplicitMinSize(BSize(250.0, B_SIZE_UNSET)); separator->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1.0)); diff --git a/src/apps/terminal/FindWindow.h b/src/apps/terminal/FindWindow.h index f3c9bb3776..f2b6e3cf7a 100644 --- a/src/apps/terminal/FindWindow.h +++ b/src/apps/terminal/FindWindow.h @@ -1,5 +1,5 @@ /* - * Copyright 2007, Haiku, Inc. + * Copyright 2007-2013 Haiku, Inc. All rights reserved. * Copyright 2003-2004 Kian Duffy, myob@users.sourceforge.net * Parts Copyright 1998-1999 Kazuho Okui and Takashi Murai. * All rights reserved. Distributed under the terms of the MIT license. @@ -29,8 +29,8 @@ public: bool matchCase, bool forwardSearch); virtual ~FindWindow(); - virtual void Quit(); virtual void MessageReceived(BMessage* msg); + virtual void Quit(); private: void _SendFindMessage(); diff --git a/src/apps/terminal/TermWindow.cpp b/src/apps/terminal/TermWindow.cpp index 5c734312c1..67a884cb48 100644 --- a/src/apps/terminal/TermWindow.cpp +++ b/src/apps/terminal/TermWindow.cpp @@ -9,6 +9,7 @@ * Authors: * Kian Duffy, myob@users.sourceforge.net * Daniel Furrer, assimil8or@users.sourceforge.net + * John Scipione, jscipione@gmail.com * Siarzhuk Zharski, zharik@gmx.li */ From 88c2518b233cc07ba921a287dd973ab4da61bcd2 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Fri, 10 May 2013 00:51:57 -0400 Subject: [PATCH 084/136] Terminal: Layout the find window better --- src/apps/terminal/FindWindow.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/apps/terminal/FindWindow.cpp b/src/apps/terminal/FindWindow.cpp index dda76db5e3..4bcd81cf2e 100644 --- a/src/apps/terminal/FindWindow.cpp +++ b/src/apps/terminal/FindWindow.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -50,20 +51,25 @@ FindWindow::FindWindow(BMessenger messenger, const BString& str, BRadioButton* useSelection = NULL; const float spacing = be_control_look->DefaultItemSpacing(); - AddChild(BGroupLayoutBuilder(B_VERTICAL, 5.0) + AddChild(BGroupLayoutBuilder(B_VERTICAL, B_USE_SMALL_SPACING) .SetInsets(spacing, spacing, spacing, spacing) - .Add(BGridLayoutBuilder() + .Add(BGridLayoutBuilder(B_USE_SMALL_SPACING, B_USE_SMALL_SPACING) .Add(fTextRadio = new BRadioButton(B_TRANSLATE("Use text:"), new BMessage(TOGGLE_FIND_CONTROL)), 0, 0) .Add(fFindLabel = new BTextControl(NULL, NULL, NULL), 1, 0) .Add(useSelection = new BRadioButton(B_TRANSLATE("Use selection"), new BMessage(TOGGLE_FIND_CONTROL)), 0, 1)) + .Add(BSpaceLayoutItem::CreateVerticalStrut(spacing / 4)) .Add(separator) + .Add(BSpaceLayoutItem::CreateVerticalStrut(spacing / 4)) .Add(fForwardSearchBox = new BCheckBox(B_TRANSLATE("Search forward"))) .Add(fMatchCaseBox = new BCheckBox(B_TRANSLATE("Match case"))) .Add(fMatchWordBox = new BCheckBox(B_TRANSLATE("Match word"))) - .Add(fFindButton = new BButton(B_TRANSLATE("Find"), + .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add(fFindButton = new BButton(B_TRANSLATE("Find"), new BMessage(MSG_FIND))) + .End() .TopView()); fFindLabel->SetDivider(0.0); From 55eb18ef2f0fe1db4c60bcceaee15c5d259ea856 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Fri, 10 May 2013 00:52:58 -0400 Subject: [PATCH 085/136] Terminal: Move the find window under your cursor on open moving the window back into the screen if necessary. --- src/apps/terminal/FindWindow.cpp | 2 -- src/apps/terminal/TermWindow.cpp | 26 +++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/apps/terminal/FindWindow.cpp b/src/apps/terminal/FindWindow.cpp index 4bcd81cf2e..02bd9c0fea 100644 --- a/src/apps/terminal/FindWindow.cpp +++ b/src/apps/terminal/FindWindow.cpp @@ -98,8 +98,6 @@ FindWindow::FindWindow(BMessenger messenger, const BString& str, fFindButton->MakeDefault(true); AddShortcut((uint32)'W', B_COMMAND_KEY, new BMessage(MSG_FIND_HIDE)); - - Show(); } diff --git a/src/apps/terminal/TermWindow.cpp b/src/apps/terminal/TermWindow.cpp index 67a884cb48..073a697279 100644 --- a/src/apps/terminal/TermWindow.cpp +++ b/src/apps/terminal/TermWindow.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -730,9 +731,32 @@ TermWindow::MessageReceived(BMessage *message) break; case MENU_FIND_STRING: - if (!fFindPanel) { + if (fFindPanel == NULL) { fFindPanel = new FindWindow(this, fFindString, fFindSelection, fMatchWord, fMatchCase, fForwardSearch); + + // position the window under the mouse pointer + BPoint where; + uint32 buttons; + ChildAt(0)->GetMouse(&where, &buttons); + fFindPanel->MoveTo(ConvertToScreen(where)); + + // move window if outside of screen frame + BRect screenFrame = (BScreen(this)).Frame(); + BRect frame = fFindPanel->Frame(); + float extra = 30.0f; + if (frame.bottom + extra * 2 > screenFrame.bottom) { + fFindPanel->MoveBy(0, + screenFrame.bottom - frame.bottom - extra * 2); + } else if (frame.top - extra < screenFrame.top) + fFindPanel->MoveBy(0, screenFrame.top - frame.top + extra); + + if (frame.right + extra > screenFrame.right) { + fFindPanel->MoveBy(screenFrame.right - frame.right + - extra, 0); + } + + fFindPanel->Show(); } else fFindPanel->Activate(); break; From abb7ea65120d761dc4dedc37b6c79eff80f8b649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Fri, 10 May 2013 09:39:25 +0200 Subject: [PATCH 086/136] Renamed File menu to Team and Quit to Close. There isn't actually a file on disk somewhere. And Quit could have been mistaken to quit the entire Debugger application, as Quit in File usually does with applications. However, it will only close the that team window and only quit Debugger if it was the last open window. --- .../debugger/user_interface/gui/team_window/TeamWindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp index a23c8216a0..cbb6e7118a 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp @@ -841,10 +841,10 @@ TeamWindow::_Init() fSourcePathView->AddFilter(filter); // add menus and menu items - BMenu* menu = new BMenu("File"); + BMenu* menu = new BMenu("Team"); fMenuBar->AddItem(menu); - BMenuItem* item = new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), - 'Q'); + BMenuItem* item = new BMenuItem("Close", new BMessage(B_QUIT_REQUESTED), + 'W'); menu->AddItem(item); item->SetTarget(this); menu = new BMenu("Edit"); From 9f5437a40bd3b3fcbccfd619e0d8c4257d237445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Fri, 10 May 2013 09:57:43 +0200 Subject: [PATCH 087/136] Changed hierarchy of splits to give variables/registers more room --- .../gui/team_window/TeamWindow.cpp | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp index cbb6e7118a..079df7bd64 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp @@ -766,23 +766,23 @@ TeamWindow::_Init() .GetSplitView(&fFunctionSplitView) .SetInsets(B_USE_SMALL_INSETS) .Add(fTabView = new BTabView("tab view"), 0.4f) - .AddGroup(B_VERTICAL, B_USE_SMALL_SPACING) - .AddGroup(B_HORIZONTAL, B_USE_SMALL_SPACING) - .Add(fRunButton = new BButton("Run")) - .Add(fStepOverButton = new BButton("Step Over")) - .Add(fStepIntoButton = new BButton("Step Into")) - .Add(fStepOutButton = new BButton("Step Out")) - .AddGlue() - .End() - .Add(fSourcePathView = new BStringView( - "source path", - "Source path unavailable."), 4.0f) - .AddSplit(B_HORIZONTAL, 3.0f) - .GetSplitView(&fSourceSplitView) + .AddSplit(B_HORIZONTAL, 3.0f) + .GetSplitView(&fSourceSplitView) + .AddGroup(B_VERTICAL, B_USE_SMALL_SPACING) + .AddGroup(B_HORIZONTAL, B_USE_SMALL_SPACING) + .Add(fRunButton = new BButton("Run")) + .Add(fStepOverButton = new BButton("Step Over")) + .Add(fStepIntoButton = new BButton("Step Into")) + .Add(fStepOutButton = new BButton("Step Out")) + .AddGlue() + .End() + .Add(fSourcePathView = new BStringView( + "source path", + "Source path unavailable."), 4.0f) .Add(sourceScrollView = new BScrollView("source scroll", NULL, 0, true, true), 3.0f) - .Add(fLocalsTabView = new BTabView("locals view")) .End() + .Add(fLocalsTabView = new BTabView("locals view")) .End() .End(); From 754fcddd724cefcc1b30c0cac40e8e461ca59f53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Fri, 10 May 2013 10:09:52 +0200 Subject: [PATCH 088/136] Remove the spacing between menu bar and contents * The spacing is already present due to the insets of the contents, so there was some extra room between the menu and the contents which this commit removes. --- src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp index 079df7bd64..9edb13f8a2 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp @@ -760,7 +760,7 @@ TeamWindow::_Init() { BScrollView* sourceScrollView; - BLayoutBuilder::Group<>(this, B_VERTICAL) + BLayoutBuilder::Group<>(this, B_VERTICAL, 0.0f) .Add(fMenuBar = new BMenuBar("Menu")) .AddSplit(B_VERTICAL, 3.0f) .GetSplitView(&fFunctionSplitView) From d4f100e56ef82d007ed3428bd8b7d0838425477f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Fri, 10 May 2013 10:55:54 +0200 Subject: [PATCH 089/136] Unify spacing * Unify split width * Make break point list attach to tab frame, apply default insets and spacing to buttons. --- .../gui/team_window/BreakpointsView.cpp | 5 +++-- .../user_interface/gui/team_window/TeamWindow.cpp | 14 ++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp index 599113b99e..7095cdd183 100644 --- a/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/BreakpointsView.cpp @@ -205,9 +205,10 @@ BreakpointsView::WatchpointSelectionChanged(Watchpoint* watchpoint) void BreakpointsView::_Init() { - BLayoutBuilder::Group<>(this) + BLayoutBuilder::Group<>(this, B_HORIZONTAL, 0.0f) .Add(fListView = BreakpointListView::Create(fTeam, this)) - .AddGroup(B_VERTICAL, 4.0f) + .AddGroup(B_VERTICAL, B_USE_SMALL_SPACING) + .SetInsets(B_USE_SMALL_SPACING) .Add(fToggleBreakpointButton = new BButton("Toggle")) .Add(fRemoveBreakpointButton = new BButton("Remove")) .AddGlue() diff --git a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp index 9edb13f8a2..0f2e594e12 100644 --- a/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp +++ b/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp @@ -760,13 +760,15 @@ TeamWindow::_Init() { BScrollView* sourceScrollView; + const float splitSpacing = 3.0f; + BLayoutBuilder::Group<>(this, B_VERTICAL, 0.0f) .Add(fMenuBar = new BMenuBar("Menu")) - .AddSplit(B_VERTICAL, 3.0f) + .AddSplit(B_VERTICAL, splitSpacing) .GetSplitView(&fFunctionSplitView) .SetInsets(B_USE_SMALL_INSETS) .Add(fTabView = new BTabView("tab view"), 0.4f) - .AddSplit(B_HORIZONTAL, 3.0f) + .AddSplit(B_HORIZONTAL, splitSpacing) .GetSplitView(&fSourceSplitView) .AddGroup(B_VERTICAL, B_USE_SMALL_SPACING) .AddGroup(B_HORIZONTAL, B_USE_SMALL_SPACING) @@ -780,7 +782,7 @@ TeamWindow::_Init() "source path", "Source path unavailable."), 4.0f) .Add(sourceScrollView = new BScrollView("source scroll", - NULL, 0, true, true), 3.0f) + NULL, 0, true, true), splitSpacing) .End() .Add(fLocalsTabView = new BTabView("locals view")) .End() @@ -790,7 +792,7 @@ TeamWindow::_Init() sourceScrollView->SetTarget(fSourceView = SourceView::Create(fTeam, this)); // add threads tab - BSplitView* threadGroup = new BSplitView(B_HORIZONTAL); + BSplitView* threadGroup = new BSplitView(B_HORIZONTAL, splitSpacing); threadGroup->SetName("Threads"); fTabView->AddTab(threadGroup); BLayoutBuilder::Split<>(threadGroup) @@ -799,7 +801,7 @@ TeamWindow::_Init() .Add(fStackTraceView = StackTraceView::Create(this)); // add images tab - BSplitView* imagesGroup = new BSplitView(B_HORIZONTAL); + BSplitView* imagesGroup = new BSplitView(B_HORIZONTAL, splitSpacing); imagesGroup->SetName("Images"); fTabView->AddTab(imagesGroup); BLayoutBuilder::Split<>(imagesGroup) @@ -813,7 +815,7 @@ TeamWindow::_Init() breakpointsGroup->SetName("Breakpoints"); fTabView->AddTab(breakpointsGroup); BLayoutBuilder::Group<>(breakpointsGroup) - .SetInsets(B_USE_SMALL_INSETS) +// .SetInsets(0.0f) .Add(fBreakpointsView = BreakpointsView::Create(fTeam, this)); // add local variables tab From fe1f74ab54b33a520b7a2687fc241422252e5f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 18:42:22 +0200 Subject: [PATCH 090/136] media_server: fixes 64 bit warnings --- src/servers/media/AddOnManager.cpp | 12 +- src/servers/media/AppManager.cpp | 14 +- src/servers/media/BufferManager.cpp | 60 +++-- src/servers/media/FormatManager.cpp | 6 +- src/servers/media/NodeManager.cpp | 298 ++++++++++++---------- src/servers/media/NotificationManager.cpp | 8 +- src/servers/media/media_server.cpp | 12 +- 7 files changed, 222 insertions(+), 188 deletions(-) diff --git a/src/servers/media/AddOnManager.cpp b/src/servers/media/AddOnManager.cpp index ad84b71a7b..b8876a99de 100644 --- a/src/servers/media/AddOnManager.cpp +++ b/src/servers/media/AddOnManager.cpp @@ -117,7 +117,7 @@ AddOnManager::GetDecoderForFormat(xfer_entry_ref* _decoderRef, BAutolock locker(fLock); printf("AddOnManager::GetDecoderForFormat: searching decoder for encoding " - "%ld\n", format.Encoding()); + "%" B_PRIu32 "\n", format.Encoding()); // Since the list of decoders is unsorted, we need to search for // a decoder by add-on directory, in order to maintain the shadowing @@ -175,7 +175,7 @@ AddOnManager::GetEncoder(xfer_entry_ref* _encoderRef, int32 id) // check if the encoder matches the supplied format if (info->internalID == (uint32)id) { printf("AddOnManager::GetEncoderForFormat: found encoder %s for " - "id %ld\n", info->ref.name, id); + "id %" B_PRId32 "\n", info->ref.name, id); *_encoderRef = info->ref; return B_OK; @@ -183,7 +183,7 @@ AddOnManager::GetEncoder(xfer_entry_ref* _encoderRef, int32 id) } printf("AddOnManager::GetEncoderForFormat: failed to find encoder for id " - "%ld\n", id); + "%" B_PRId32 "\n", id); return B_ENTRY_NOT_FOUND; } @@ -198,7 +198,7 @@ AddOnManager::GetWriter(xfer_entry_ref* _ref, uint32 internalID) for (fWriterList.Rewind(); fWriterList.GetNext(&info);) { if (info->internalID == internalID) { printf("AddOnManager::GetWriter: found writer %s for " - "internal_id %lu\n", info->ref.name, internalID); + "internal_id %" B_PRId32 "\n", info->ref.name, internalID); *_ref = info->ref; return B_OK; @@ -425,7 +425,7 @@ printf("removing writer '%s'\n", writerInfo->ref.name); encoder_info* encoderInfo; for (fEncoderList.Rewind(); fEncoderList.GetNext(&encoderInfo);) { if (encoderInfo->ref == ref) { -printf("removing encoder '%s', id %lu\n", encoderInfo->ref.name, +printf("removing encoder '%s', id %" B_PRIu32 "\n", encoderInfo->ref.name, encoderInfo->internalID); fEncoderList.RemoveCurrent(); // Keep going, since we add multiple encoder infos per add-on. @@ -600,7 +600,7 @@ AddOnManager::_FindDecoder(const media_format& format, const BPath& path, continue; printf("AddOnManager::GetDecoderForFormat: found decoder %s/%s " - "for encoding %ld\n", path.Path(), info->ref.name, + "for encoding %" B_PRIu32 "\n", path.Path(), info->ref.name, decoderFormat->Encoding()); *_decoderRef = info->ref; diff --git a/src/servers/media/AppManager.cpp b/src/servers/media/AppManager.cpp index 083a871f42..589dabd0ba 100644 --- a/src/servers/media/AppManager.cpp +++ b/src/servers/media/AppManager.cpp @@ -77,9 +77,10 @@ AppManager::RegisterTeam(team_id team, const BMessenger& messenger) { BAutolock lock(this); - TRACE("AppManager::RegisterTeam %ld\n", team); + TRACE("AppManager::RegisterTeam %" B_PRId32 "\n", team); if (HasTeam(team)) { - ERROR("AppManager::RegisterTeam: team %ld already registered\n", team); + ERROR("AppManager::RegisterTeam: team %" B_PRId32 " already" + " registered\n", team); return B_ERROR; } @@ -96,7 +97,7 @@ AppManager::RegisterTeam(team_id team, const BMessenger& messenger) status_t AppManager::UnregisterTeam(team_id team) { - TRACE("AppManager::UnregisterTeam %ld\n", team); + TRACE("AppManager::UnregisterTeam %" B_PRId32 "\n", team); Lock(); bool isRemoved = fMap.erase(team) != 0; @@ -146,8 +147,9 @@ AppManager::Dump() for (; iterator != fMap.end(); iterator++) { app_info info; be_roster->GetRunningAppInfo(iterator->first, &info); - printf(" team %ld \"%s\", messenger %svalid\n", iterator->first, - info.ref.name, iterator->second.IsValid() ? "" : "NOT "); + printf(" team %" B_PRId32 " \"%s\", messenger %svalid\n", + iterator->first, info.ref.name, + iterator->second.IsValid() ? "" : "NOT "); } printf("AppManager: list end\n"); @@ -159,7 +161,7 @@ AppManager::_CleanupTeam(team_id team) { ASSERT(!IsLocked()); - TRACE("AppManager: cleaning up team %ld\n", team); + TRACE("AppManager: cleaning up team %" B_PRId32 "\n", team); gNodeManager->CleanupTeam(team); gBufferManager->CleanupTeam(team); diff --git a/src/servers/media/BufferManager.cpp b/src/servers/media/BufferManager.cpp index 2f821c30bc..2db9a55116 100644 --- a/src/servers/media/BufferManager.cpp +++ b/src/servers/media/BufferManager.cpp @@ -44,12 +44,13 @@ BufferManager::RegisterBuffer(team_id team, media_buffer_id bufferID, { BAutolock lock(fLocker); - TRACE("RegisterBuffer team = %ld, bufferid = %ld\n", team, bufferID); + TRACE("RegisterBuffer team = %" B_PRId32 ", bufferid = %" B_PRId32 "\n", + team, bufferID); buffer_info* info; if (!fBufferInfoMap.Get(bufferID, info)) { - ERROR("failed to register buffer! team = %ld, bufferid = %ld\n", team, - bufferID); + ERROR("failed to register buffer! team = %" B_PRId32 ", bufferid = %" + B_PRId32 "\n", team, bufferID); return B_ERROR; } @@ -74,8 +75,9 @@ BufferManager::RegisterBuffer(team_id team, size_t size, int32 flags, area_id clonedArea = _CloneArea(area); if (clonedArea < 0) { - ERROR("RegisterBuffer: failed to clone buffer! error = %#lx, team = " - "%ld, area = %ld, offset = %ld, size = %ld\n", clonedArea, team, + ERROR("RegisterBuffer: failed to clone buffer! error = %#" B_PRIx32 + ", team = %" B_PRId32 ", area = %" B_PRId32 ", offset = %" + B_PRIuSIZE ", size = %" B_PRIuSIZE "\n", clonedArea, team, area, offset, size); return clonedArea; } @@ -107,31 +109,32 @@ status_t BufferManager::UnregisterBuffer(team_id team, media_buffer_id bufferID) { BAutolock lock(fLocker); - TRACE("UnregisterBuffer: team = %ld, bufferID = %ld\n", team, bufferID); + TRACE("UnregisterBuffer: team = %" B_PRId32 ", bufferID = %" B_PRId32 "\n", + team, bufferID); buffer_info* info; if (!fBufferInfoMap.Get(bufferID, info)) { - ERROR("UnregisterBuffer: failed to unregister buffer! team = %ld, " - "bufferID = %ld\n", team, bufferID); + ERROR("UnregisterBuffer: failed to unregister buffer! team = %" + B_PRId32 ", bufferID = %" B_PRId32 "\n", team, bufferID); return B_ERROR; } if (info->teams.find(team) == info->teams.end()) { - ERROR("UnregisterBuffer: failed to find team = %ld belonging to " - "bufferID = %ld\n", team, bufferID); + ERROR("UnregisterBuffer: failed to find team = %" B_PRId32 " belonging" + " to bufferID = %" B_PRId32 "\n", team, bufferID); return B_ERROR; } info->teams.erase(team); - TRACE("UnregisterBuffer: team = %ld removed from bufferID = %ld\n", team, - bufferID); + TRACE("UnregisterBuffer: team = %" B_PRId32 " removed from bufferID = %" + B_PRId32 "\n", team, bufferID); if (info->teams.empty()) { _ReleaseClonedArea(info->area); fBufferInfoMap.Remove(bufferID); - TRACE("UnregisterBuffer: bufferID = %ld removed\n", bufferID); + TRACE("UnregisterBuffer: bufferID = %" B_PRId32 " removed\n", bufferID); } return B_OK; @@ -143,7 +146,7 @@ BufferManager::CleanupTeam(team_id team) { BAutolock lock(fLocker); - TRACE("BufferManager::CleanupTeam: team %ld\n", team); + TRACE("BufferManager::CleanupTeam: team %" B_PRId32 "\n", team); BufferInfoMap::Iterator iterator = fBufferInfoMap.GetIterator(); while (iterator.HasNext()) { @@ -152,8 +155,8 @@ BufferManager::CleanupTeam(team_id team) entry.value.teams.erase(team); if (entry.value.teams.empty()) { - PRINT(1, "BufferManager::CleanupTeam: removing buffer id %ld that " - "has no teams\n", entry.key.GetHashCode()); + PRINT(1, "BufferManager::CleanupTeam: removing buffer id %" + B_PRId32 " that has no teams\n", entry.key.GetHashCode()); _ReleaseClonedArea(entry.value.area); iterator.Remove(); } @@ -172,13 +175,14 @@ BufferManager::Dump() BufferInfoMap::Iterator iterator = fBufferInfoMap.GetIterator(); while (iterator.HasNext()) { buffer_info& info = *iterator.NextValue(); - printf(" buffer-id %ld, area-id %ld, offset %ld, size %ld, flags " - "%#08lx\n", info.id, info.area, info.offset, info.size, info.flags); + printf(" buffer-id %" B_PRId32 ", area-id %" B_PRId32 ", offset %ld, " + "size %ld, flags %#08" B_PRIx32 "\n", info.id, info.area, + info.offset, info.size, info.flags); printf(" assigned teams: "); std::set::iterator teamIterator = info.teams.begin(); for (; teamIterator != info.teams.end(); teamIterator++) { - printf("%ld, ", *teamIterator); + printf("%" B_PRId32 ", ", *teamIterator); } printf("\n"); } @@ -193,8 +197,8 @@ BufferManager::_CloneArea(area_id area) clone_info* info; if (fCloneInfoMap.Get(area, info)) { // we have already cloned this particular area - TRACE("BufferManager::_CloneArea() area %ld has already been " - "cloned (id %ld)\n", area, info->clone); + TRACE("BufferManager::_CloneArea() area %" B_PRId32 " has already" + " been cloned (id %" B_PRId32 ")\n", area, info->clone); info->ref_count++; return info->clone; @@ -205,8 +209,8 @@ BufferManager::_CloneArea(area_id area) area_id clonedArea = clone_area("media_server cloned buffer", &address, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, area); - TRACE("BufferManager::_CloneArea() cloned area %ld, clone id %ld\n", - area, clonedArea); + TRACE("BufferManager::_CloneArea() cloned area %" B_PRId32 ", clone id %" + B_PRId32 "\n", area, clonedArea); if (clonedArea < 0) return clonedArea; @@ -235,19 +239,19 @@ BufferManager::_ReleaseClonedArea(area_id clone) clone_info* info; if (!fCloneInfoMap.Get(source, info)) { ERROR("BufferManager::_ReleaseClonedArea(): could not find clone info " - "for id %ld (clone %ld)\n", source, clone); + "for id %" B_PRId32 " (clone %" B_PRId32 ")\n", source, clone); return; } if (--info->ref_count == 0) { - TRACE("BufferManager::_ReleaseClonedArea(): delete cloned area %ld " - "(source %ld)\n", clone, source); + TRACE("BufferManager::_ReleaseClonedArea(): delete cloned area %" + B_PRId32 " (source %" B_PRId32 ")\n", clone, source); fSourceInfoMap.Remove(clone); fCloneInfoMap.Remove(source); delete_area(clone); } else { - TRACE("BufferManager::_ReleaseClonedArea(): released cloned area %ld " - "(source %ld)\n", clone, source); + TRACE("BufferManager::_ReleaseClonedArea(): released cloned area %" + B_PRId32 " (source %" B_PRId32 ")\n", clone, source); } } diff --git a/src/servers/media/FormatManager.cpp b/src/servers/media/FormatManager.cpp index fd3e48e5c8..6d0e3b3641 100644 --- a/src/servers/media/FormatManager.cpp +++ b/src/servers/media/FormatManager.cpp @@ -173,8 +173,8 @@ FormatManager::GetFormats(BMessage& message) reply.AddInt64("timestamp", system_time()); int32 count = fList.CountItems(); - printf("FormatManager::GetFormats(): put %ld formats into message\n", - count); + printf("FormatManager::GetFormats(): put %" B_PRId32 " formats into " + "message\n", count); for (int32 i = 0; i < count; i++) { meta_format* format = fList.ItemAt(i); reply.AddData("formats", MEDIA_META_FORMAT_TYPE, format, @@ -289,7 +289,7 @@ FormatManager::RemoveFormat(const media_format& format) if (metaFormat->format == format) { if (foundIndex != -1) { printf("FormatManager::RemoveFormat() - format already " - "present at previous index: %ld\n", foundIndex); + "present at previous index: %" B_PRId32 "\n", foundIndex); } foundIndex = i; } diff --git a/src/servers/media/NodeManager.cpp b/src/servers/media/NodeManager.cpp index b0f585bb2a..69e72c693d 100644 --- a/src/servers/media/NodeManager.cpp +++ b/src/servers/media/NodeManager.cpp @@ -168,9 +168,10 @@ NodeManager::RegisterNode(media_addon_id addOnID, int32 flavorID, *_nodeID = fNextNodeID++; - TRACE("NodeManager::RegisterNode: node %ld, addon_id %ld, flavor_id %ld, " - "name \"%s\", kinds %#Lx, port %ld, team %ld\n", *_nodeID, addOnID, - flavorID, name, kinds, port, team); + TRACE("NodeManager::RegisterNode: node %" B_PRId32 ", addon_id %" B_PRId32 + ", flavor_id %" B_PRId32 ", name \"%s\", kinds %#Lx, port %" B_PRId32 + ", team %" B_PRId32 "\n", *_nodeID, addOnID, flavorID, name, kinds, + port, team); return B_OK; } @@ -179,28 +180,30 @@ status_t NodeManager::UnregisterNode(media_node_id id, team_id team, media_addon_id* _addOnID, int32* _flavorID) { - TRACE("NodeManager::UnregisterNode enter: node %ld, team %ld\n", id, team); + TRACE("NodeManager::UnregisterNode enter: node %" B_PRId32 ", team %" + B_PRId32 "\n", id, team); BAutolock _(this); NodeMap::iterator found = fNodeMap.find(id); if (found == fNodeMap.end()) { - ERROR("NodeManager::UnregisterNode: couldn't find node %ld (team " - "%ld)\n", id, team); + ERROR("NodeManager::UnregisterNode: couldn't find node %" B_PRId32 + " (team %" B_PRId32 ")\n", id, team); return B_ERROR; } registered_node& node = found->second; if (node.containing_team != team) { - ERROR("NodeManager::UnregisterNode: team %ld tried to unregister " - "node %ld, but it was instantiated by team %ld\n", team, id, - node.containing_team); + ERROR("NodeManager::UnregisterNode: team %" B_PRId32 " tried to " + "unregister node %" B_PRId32 ", but it was instantiated by team %" + B_PRId32 "\n", team, id, node.containing_team); return B_ERROR; } if (node.ref_count != 1) { - ERROR("NodeManager::UnregisterNode: node %ld, team %ld has ref count " - "%ld (should be 1)\n", id, team, node.ref_count); + ERROR("NodeManager::UnregisterNode: node %" B_PRId32 ", team %" + B_PRId32 " has ref count %" B_PRId32 " (should be 1)\n", id, team, + node.ref_count); //return B_ERROR; } @@ -209,8 +212,9 @@ NodeManager::UnregisterNode(media_node_id id, team_id team, fNodeMap.erase(found); - TRACE("NodeManager::UnregisterNode leave: node %ld, addon_id %ld, " - "flavor_id %ld team %ld\n", id, *_addOnID, *_flavorID, team); + TRACE("NodeManager::UnregisterNode leave: node %" B_PRId32 ", addon_id %" + B_PRId32 ", flavor_id %" B_PRId32 " team %" B_PRId32 "\n", id, + *_addOnID, *_flavorID, team); return B_OK; } @@ -218,14 +222,15 @@ NodeManager::UnregisterNode(media_node_id id, team_id team, status_t NodeManager::ReleaseNodeReference(media_node_id id, team_id team) { - TRACE("NodeManager::ReleaseNodeReference enter: node %ld, team %ld\n", id, - team); + TRACE("NodeManager::ReleaseNodeReference enter: node %" B_PRId32 ", team %" + B_PRId32 "\n", id, team); BAutolock _(this); NodeMap::iterator found = fNodeMap.find(id); if (found == fNodeMap.end()) { - ERROR("NodeManager::ReleaseNodeReference: node %ld not found\n", id); + ERROR("NodeManager::ReleaseNodeReference: node %" B_PRId32 " not " + "found\n", id); return B_ERROR; } @@ -246,8 +251,8 @@ NodeManager::ReleaseNodeReference(media_node_id id, team_id team) node.creator = -1; // invalidate! team = addOnServer; } else { - ERROR("NodeManager::ReleaseNodeReference: node %ld has no team " - "%ld references\n", id, team); + ERROR("NodeManager::ReleaseNodeReference: node %" B_PRId32 " has " + "no team %" B_PRId32 " references\n", id, team); return B_ERROR; } } @@ -261,8 +266,8 @@ NodeManager::ReleaseNodeReference(media_node_id id, team_id team) node.team_ref_count.erase(teamRef); if (--node.ref_count == 0) { - PRINT(1, "NodeManager::ReleaseNodeReference: detected released node is " - "now unused, node %ld\n", id); + PRINT(1, "NodeManager::ReleaseNodeReference: detected released node is" + " now unused, node %" B_PRId32 "\n", id); // TODO: remove! node_final_release_command command; @@ -270,13 +275,14 @@ NodeManager::ReleaseNodeReference(media_node_id id, team_id team) sizeof(command)); if (status != B_OK) { ERROR("NodeManager::ReleaseNodeReference: can't send command to " - "node %ld\n", id); + "node %" B_PRId32 "\n", id); // ignore error } } - TRACE("NodeManager::ReleaseNodeReference leave: node %ld, team %ld, " - "ref %ld, team ref %ld\n", id, team, node.ref_count, teamCount); + TRACE("NodeManager::ReleaseNodeReference leave: node %" B_PRId32 ", team %" + B_PRId32 ", ref %" B_PRId32 ", team ref %" B_PRId32 "\n", id, team, + node.ref_count, teamCount); return B_OK; } @@ -284,13 +290,14 @@ NodeManager::ReleaseNodeReference(media_node_id id, team_id team) status_t NodeManager::ReleaseNodeAll(media_node_id id) { - TRACE("NodeManager::ReleaseNodeAll enter: node %ld\n", id); + TRACE("NodeManager::ReleaseNodeAll enter: node %" B_PRId32 "\n", id); BAutolock _(this); NodeMap::iterator found = fNodeMap.find(id); if (found == fNodeMap.end()) { - ERROR("NodeManager::ReleaseNodeAll: node %ld not found\n", id); + ERROR("NodeManager::ReleaseNodeAll: node %" B_PRId32 " not found\n", + id); return B_ERROR; } @@ -303,11 +310,11 @@ NodeManager::ReleaseNodeAll(media_node_id id) sizeof(command)); if (status != B_OK) { ERROR("NodeManager::ReleaseNodeAll: can't send command to " - "node %ld\n", id); + "node %" B_PRId32 "\n", id); // ignore error } - TRACE("NodeManager::ReleaseNodeAll leave: node %ld\n", id); + TRACE("NodeManager::ReleaseNodeAll leave: node %" B_PRId32 "\n", id); return B_OK; } @@ -315,21 +322,23 @@ NodeManager::ReleaseNodeAll(media_node_id id) status_t NodeManager::SetNodeCreator(media_node_id id, team_id creator) { - TRACE("NodeManager::SetNodeCreator node %ld, creator %ld\n", id, creator); + TRACE("NodeManager::SetNodeCreator node %" B_PRId32 ", creator %" B_PRId32 + "\n", id, creator); BAutolock _(this); NodeMap::iterator found = fNodeMap.find(id); if (found == fNodeMap.end()) { - ERROR("NodeManager::SetNodeCreator: node %ld not found\n", id); + ERROR("NodeManager::SetNodeCreator: node %" B_PRId32 " not found\n", + id); return B_ERROR; } registered_node& node = found->second; if (node.creator != -1) { - ERROR("NodeManager::SetNodeCreator: node %ld is already assigned " - "creator %ld\n", id, node.creator); + ERROR("NodeManager::SetNodeCreator: node %" B_PRId32 " is already" + " assigned creator %" B_PRId32 "\n", id, node.creator); return B_ERROR; } @@ -341,20 +350,22 @@ NodeManager::SetNodeCreator(media_node_id id, team_id creator) status_t NodeManager::GetCloneForID(media_node_id id, team_id team, media_node* node) { - TRACE("NodeManager::GetCloneForID enter: node %ld team %ld\n", id, team); + TRACE("NodeManager::GetCloneForID enter: node %" B_PRId32 " team %" + B_PRId32 "\n", id, team); BAutolock _(this); status_t status = _AcquireNodeReference(id, team); if (status != B_OK) { ERROR("NodeManager::GetCloneForID: couldn't increment ref count, " - "node %ld team %ld\n", id, team); + "node %" B_PRId32 " team %" B_PRId32 "\n", id, team); return status; } NodeMap::iterator found = fNodeMap.find(id); if (found == fNodeMap.end()) { - ERROR("NodeManager::GetCloneForID: node %ld not found\n", id); + ERROR("NodeManager::GetCloneForID: node %" B_PRId32 " not found\n", + id); return B_ERROR; } @@ -364,7 +375,8 @@ NodeManager::GetCloneForID(media_node_id id, team_id team, media_node* node) node->port = registeredNode.port; node->kind = registeredNode.kinds; - TRACE("NodeManager::GetCloneForID leave: node %ld team %ld\n", id, team); + TRACE("NodeManager::GetCloneForID leave: node %" B_PRId32 " team %" + B_PRId32 "\n", id, team); return B_OK; } @@ -382,13 +394,14 @@ NodeManager::GetClone(node_type type, team_id team, media_node* node, { BAutolock _(this); - TRACE("NodeManager::GetClone enter: team %ld, type %d (%s)\n", team, type, get_node_type(type)); + TRACE("NodeManager::GetClone enter: team %" B_PRId32 ", type %d (%s)\n", + team, type, get_node_type(type)); media_node_id id; status_t status = GetDefaultNode(type, &id, inputName, _inputID); if (status != B_OK) { - ERROR("NodeManager::GetClone: couldn't GetDefaultNode, team %ld, " - "type %d (%s)\n", team, type, get_node_type(type)); + ERROR("NodeManager::GetClone: couldn't GetDefaultNode, team %" B_PRId32 + ", type %d (%s)\n", team, type, get_node_type(type)); *node = media_node::null; return status; } @@ -396,15 +409,16 @@ NodeManager::GetClone(node_type type, team_id team, media_node* node, status = GetCloneForID(id, team, node); if (status != B_OK) { - ERROR("NodeManager::GetClone: couldn't GetCloneForID, id %ld, team " - "%ld, type %d (%s)\n", id, team, type, get_node_type(type)); + ERROR("NodeManager::GetClone: couldn't GetCloneForID, id %" B_PRId32 + ", team %" B_PRId32 ", type %d (%s)\n", id, team, type, + get_node_type(type)); *node = media_node::null; return status; } ASSERT(id == node->node); - TRACE("NodeManager::GetClone leave: node id %ld, node port %ld, node " - "kind %#lx\n", node->node, node->port, node->kind); + TRACE("NodeManager::GetClone leave: node id %" B_PRId32 ", node port %" + B_PRId32 ", node kind %#lx\n", node->node, node->port, node->kind); return B_OK; } @@ -412,12 +426,12 @@ NodeManager::GetClone(node_type type, team_id team, media_node* node, status_t NodeManager::ReleaseNode(const media_node& node, team_id team) { - TRACE("NodeManager::ReleaseNode enter: node %ld team %ld\n", node.node, - team); + TRACE("NodeManager::ReleaseNode enter: node %" B_PRId32 " team %" B_PRId32 + "\n", node.node, team); if (ReleaseNodeReference(node.node, team) != B_OK) { - ERROR("NodeManager::ReleaseNode: couldn't decrement node %ld team %ld " - "ref count\n", node.node, team); + ERROR("NodeManager::ReleaseNode: couldn't decrement node %" B_PRId32 + " team %" B_PRId32 " ref count\n", node.node, team); } return B_OK; @@ -432,7 +446,8 @@ NodeManager::PublishInputs(const media_node& node, const media_input* inputs, NodeMap::iterator found = fNodeMap.find(node.node); if (found == fNodeMap.end()) { - ERROR("NodeManager::PublishInputs: node %ld not found\n", node.node); + ERROR("NodeManager::PublishInputs: node %" B_PRId32 " not found\n", + node.node); return B_ERROR; } @@ -459,7 +474,8 @@ NodeManager::PublishOutputs(const media_node &node, const media_output* outputs, NodeMap::iterator found = fNodeMap.find(node.node); if (found == fNodeMap.end()) { - ERROR("NodeManager::PublishOutputs: node %ld not found\n", node.node); + ERROR("NodeManager::PublishOutputs: node %" B_PRId32 " not found\n", + node.node); return B_ERROR; } @@ -489,8 +505,8 @@ NodeManager::FindNodeID(port_id port, media_node_id* _id) if (node.port == port) { *_id = node.node_id; - TRACE("NodeManager::FindNodeID found port %ld, node %ld\n", port, - node.node_id); + TRACE("NodeManager::FindNodeID found port %" B_PRId32 ", node %" + B_PRId32 "\n", port, node.node_id); return B_OK; } @@ -498,8 +514,8 @@ NodeManager::FindNodeID(port_id port, media_node_id* _id) for (; outIterator != node.output_list.end(); outIterator++) { if (outIterator->source.port == port) { *_id = node.node_id; - TRACE("NodeManager::FindNodeID found output port %ld, node " - "%ld\n", port, node.node_id); + TRACE("NodeManager::FindNodeID found output port %" B_PRId32 + ", node %" B_PRId32 "\n", port, node.node_id); return B_OK; } } @@ -508,14 +524,14 @@ NodeManager::FindNodeID(port_id port, media_node_id* _id) for (; inIterator != node.input_list.end(); inIterator++) { if (inIterator->destination.port == port) { *_id = node.node_id; - TRACE("NodeManager::FindNodeID found input port %ld, node " - "%ld\n", port, node.node_id); + TRACE("NodeManager::FindNodeID found input port %" B_PRId32 + ", node %" B_PRId32 "\n", port, node.node_id); return B_OK; } } } - ERROR("NodeManager::FindNodeID failed, port %ld\n", port); + ERROR("NodeManager::FindNodeID failed, port %" B_PRId32 "\n", port); return B_ERROR; } @@ -529,8 +545,8 @@ NodeManager::GetDormantNodeInfo(const media_node& node, NodeMap::iterator found = fNodeMap.find(node.node); if (found == fNodeMap.end()) { - ERROR("NodeManager::GetDormantNodeInfo: node %ld not found\n", - node.node); + ERROR("NodeManager::GetDormantNodeInfo: node %" B_PRId32 " not found" + "\n", node.node); return B_ERROR; } @@ -540,9 +556,9 @@ NodeManager::GetDormantNodeInfo(const media_node& node, && node.node != NODE_SYSTEM_TIMESOURCE_ID) { // This function must return an error if the node is application owned TRACE("NodeManager::GetDormantNodeInfo NODE IS APPLICATION OWNED! " - "node %ld, add_on_id %ld, flavor_id %ld, name \"%s\"\n", node.node, - registeredNode.add_on_id, registeredNode.flavor_id, - registeredNode.name); + "node %" B_PRId32 ", add_on_id %" B_PRId32 ", flavor_id %" B_PRId32 + ", name \"%s\"\n", node.node, registeredNode.add_on_id, + registeredNode.flavor_id, registeredNode.name); return B_ERROR; } @@ -554,9 +570,10 @@ NodeManager::GetDormantNodeInfo(const media_node& node, nodeInfo->flavor_id = registeredNode.flavor_id; strlcpy(nodeInfo->name, registeredNode.name, sizeof(nodeInfo->name)); - TRACE("NodeManager::GetDormantNodeInfo node %ld, add_on_id %ld, " - "flavor_id %ld, name \"%s\"\n", node.node, registeredNode.add_on_id, - registeredNode.flavor_id, registeredNode.name); + TRACE("NodeManager::GetDormantNodeInfo node %" B_PRId32 ", add_on_id %" + B_PRId32 ", flavor_id %" B_PRId32 ", name \"%s\"\n", node.node, + registeredNode.add_on_id, registeredNode.flavor_id, + registeredNode.name); return B_OK; } @@ -568,7 +585,7 @@ NodeManager::GetLiveNodeInfo(const media_node& node, live_node_info* liveInfo) NodeMap::iterator found = fNodeMap.find(node.node); if (found == fNodeMap.end()) { - ERROR("NodeManager::GetLiveNodeInfo: node %ld not found\n", + ERROR("NodeManager::GetLiveNodeInfo: node %" B_PRId32 " not found\n", node.node); return B_ERROR; } @@ -583,8 +600,8 @@ NodeManager::GetLiveNodeInfo(const media_node& node, live_node_info* liveInfo) liveInfo->hint_point = BPoint(0, 0); strlcpy(liveInfo->name, registeredNode.name, sizeof(liveInfo->name)); - TRACE("NodeManager::GetLiveNodeInfo node %ld, name = \"%s\"\n", node.node, - registeredNode.name); + TRACE("NodeManager::GetLiveNodeInfo node %" B_PRId32 ", name = \"%s\"\n", + node.node, registeredNode.name); return B_OK; } @@ -604,8 +621,9 @@ NodeManager::GetInstances(media_addon_id addOnID, int32 flavorID, ids[count++] = node.node_id; } - TRACE("NodeManager::GetInstances found %ld instances for addon_id %ld, " - "flavor_id %ld\n", count, addOnID, flavorID); + TRACE("NodeManager::GetInstances found %" B_PRId32 " instances for " + "addon_id %" B_PRId32 ", flavor_id %" B_PRId32 "\n", count, addOnID, + flavorID); *_count = count; return B_OK; } @@ -616,9 +634,9 @@ NodeManager::GetLiveNodes(LiveNodeList& liveNodes, int32 maxCount, const media_format* inputFormat, const media_format* outputFormat, const char* name, uint64 requireKinds) { - TRACE("NodeManager::GetLiveNodes: maxCount %ld, in-format %p, out-format " - "%p, name %s, require kinds 0x%Lx\n", maxCount, inputFormat, - outputFormat, name != NULL ? name : "NULL", requireKinds); + TRACE("NodeManager::GetLiveNodes: maxCount %" B_PRId32 ", in-format %p, " + "out-format %p, name %s, require kinds 0x%" B_PRIx64 "\n", maxCount, + inputFormat, outputFormat, name != NULL ? name : "NULL", requireKinds); BAutolock _(this); @@ -694,7 +712,7 @@ NodeManager::GetLiveNodes(LiveNodeList& liveNodes, int32 maxCount, count++; } - TRACE("NodeManager::GetLiveNodes found %ld\n", count); + TRACE("NodeManager::GetLiveNodes found %" B_PRId32 "\n", count); return B_OK; } @@ -729,8 +747,8 @@ NodeManager::RegisterAddOn(const entry_ref& ref, media_addon_id* _newID) media_addon_id id = fNextAddOnID++; -// printf("NodeManager::RegisterAddOn: ref-name \"%s\", assigning id %ld\n", -// ref.name, id); +// printf("NodeManager::RegisterAddOn: ref-name \"%s\", assigning id %" +// B_PRId32 "\n", ref.name, id); try { fPathMap.insert(std::make_pair(id, ref)); @@ -744,7 +762,7 @@ NodeManager::RegisterAddOn(const entry_ref& ref, media_addon_id* _newID) void NodeManager::UnregisterAddOn(media_addon_id addOnID) { - PRINT(1, "NodeManager::UnregisterAddOn: id %ld\n", addOnID); + PRINT(1, "NodeManager::UnregisterAddOn: id %" B_PRId32 "\n", addOnID); BAutolock _(this); @@ -774,10 +792,11 @@ NodeManager::GetAddOnRef(media_addon_id addOnID, entry_ref* ref) status_t NodeManager::AddDormantFlavorInfo(const dormant_flavor_info& flavorInfo) { - PRINT(1, "NodeManager::AddDormantFlavorInfo, addon-id %ld, flavor-id %ld, " - "name \"%s\", flavor-name \"%s\", flavor-info \"%s\"\n", - flavorInfo.node_info.addon, flavorInfo.node_info.flavor_id, - flavorInfo.node_info.name, flavorInfo.name, flavorInfo.info); + PRINT(1, "NodeManager::AddDormantFlavorInfo, addon-id %" B_PRId32 ", " + "flavor-id %" B_PRId32 ", name \"%s\", flavor-name \"%s\", flavor-info" + " \"%s\"\n", flavorInfo.node_info.addon, + flavorInfo.node_info.flavor_id, flavorInfo.node_info.name, + flavorInfo.name, flavorInfo.info); BAutolock _(this); @@ -794,13 +813,13 @@ NodeManager::AddDormantFlavorInfo(const dormant_flavor_info& flavorInfo) continue; if (info.info_valid) { - ERROR("NodeManager::AddDormantFlavorInfo, addon-id %ld, " - "flavor-id %ld does already exist\n", info.info.node_info.addon, - info.info.node_info.flavor_id); + ERROR("NodeManager::AddDormantFlavorInfo, addon-id %" B_PRId32 ", " + "flavor-id %" B_PRId32 " does already exist\n", + info.info.node_info.addon, info.info.node_info.flavor_id); } - TRACE("NodeManager::AddDormantFlavorInfo, updating addon-id %ld, " - "flavor-id %ld\n", info.info.node_info.addon, + TRACE("NodeManager::AddDormantFlavorInfo, updating addon-id %" B_PRId32 + ", flavor-id %" B_PRId32 "\n", info.info.node_info.addon, info.info.node_info.flavor_id); info.max_instances_count = flavorInfo.possible_count > 0 @@ -842,9 +861,9 @@ NodeManager::InvalidateDormantFlavorInfo(media_addon_id addOnID) dormant_add_on_flavor_info& info = *iterator; if (info.add_on_id == addOnID && info.info_valid) { - PRINT(1, "NodeManager::InvalidateDormantFlavorInfo, addon-id %ld, " - "flavor-id %ld, name \"%s\", flavor-name \"%s\", flavor-info " - "\"%s\"\n", info.info.node_info.addon, + PRINT(1, "NodeManager::InvalidateDormantFlavorInfo, addon-id %" + B_PRId32 ", flavor-id %" B_PRId32 ", name \"%s\", flavor-name " + "\"%s\", flavor-info \"%s\"\n", info.info.node_info.addon, info.info.node_info.flavor_id, info.info.node_info.name, info.info.name, info.info.info); @@ -864,9 +883,9 @@ NodeManager::RemoveDormantFlavorInfo(media_addon_id addOnID) dormant_add_on_flavor_info& info = fDormantFlavors[index]; if (info.add_on_id == addOnID) { - PRINT(1, "NodeManager::RemoveDormantFlavorInfo, addon-id %ld, " - "flavor-id %ld, name \"%s\", flavor-name \"%s\", flavor-info " - "\"%s\"\n", info.info.node_info.addon, + PRINT(1, "NodeManager::RemoveDormantFlavorInfo, addon-id %" + B_PRId32 ", flavor-id %" B_PRId32 ", name \"%s\", flavor-name " + "\"%s\", flavor-info \"%s\"\n", info.info.node_info.addon, info.info.node_info.flavor_id, info.info.node_info.name, info.info.name, info.info.info); fDormantFlavors.erase(fDormantFlavors.begin() + index--); @@ -890,9 +909,9 @@ NodeManager::IncrementFlavorInstancesCount(media_addon_id addOnID, if (info.instances_count >= info.max_instances_count) { // maximum (or more) instances already exist - ERROR("NodeManager::IncrementFlavorInstancesCount addon-id %ld, " - "flavor-id %ld maximum (or more) instances already exist\n", - addOnID, flavorID); + ERROR("NodeManager::IncrementFlavorInstancesCount addon-id %" + B_PRId32 ", flavor-id %" B_PRId32 " maximum (or more) " + "instances already exist\n", addOnID, flavorID); return B_ERROR; } @@ -914,8 +933,8 @@ NodeManager::IncrementFlavorInstancesCount(media_addon_id addOnID, return B_OK; } - ERROR("NodeManager::IncrementFlavorInstancesCount addon-id %ld, " - "flavor-id %ld not found\n", addOnID, flavorID); + ERROR("NodeManager::IncrementFlavorInstancesCount addon-id %" B_PRId32 ", " + "flavor-id %" B_PRId32 " not found\n", addOnID, flavorID); return B_ERROR; } @@ -936,9 +955,9 @@ NodeManager::DecrementFlavorInstancesCount(media_addon_id addOnID, TeamCountMap::iterator teamInstance = info.team_instances_count.find(team); if (teamInstance == info.team_instances_count.end()) { - ERROR("NodeManager::DecrementFlavorInstancesCount addon-id %ld, " - "flavor-id %ld team %ld has no references\n", addOnID, flavorID, - team); + ERROR("NodeManager::DecrementFlavorInstancesCount addon-id %" + B_PRId32 ", flavor-id %" B_PRId32 " team %" B_PRId32 " has no " + "references\n", addOnID, flavorID, team); return B_ERROR; } if (--teamInstance->second == 0) @@ -948,8 +967,8 @@ NodeManager::DecrementFlavorInstancesCount(media_addon_id addOnID, return B_OK; } - ERROR("NodeManager::DecrementFlavorInstancesCount addon-id %ld, " - "flavor-id %ld not found\n", addOnID, flavorID); + ERROR("NodeManager::DecrementFlavorInstancesCount addon-id %" B_PRId32 ", " + "flavor-id %" B_PRId32 " not found\n", addOnID, flavorID); return B_ERROR; } @@ -1070,7 +1089,7 @@ NodeManager::CleanupTeam(team_id team) fDefaultManager->CleanupTeam(team); - PRINT(1, "NodeManager::CleanupTeam: team %ld\n", team); + PRINT(1, "NodeManager::CleanupTeam: team %" B_PRId32 "\n", team); // TODO: send notifications after removing nodes @@ -1091,8 +1110,8 @@ NodeManager::CleanupTeam(team_id team) // If the team hosting this node is gone, remove node from database if (node.containing_team == team) { - PRINT(1, "NodeManager::CleanupTeam: removing node id %ld, team " - "%ld\n", node.node_id, team); + PRINT(1, "NodeManager::CleanupTeam: removing node id %" B_PRId32 + ", team %" B_PRId32 "\n", node.node_id, team); fNodeMap.erase(remove); continue; } @@ -1101,12 +1120,13 @@ NodeManager::CleanupTeam(team_id team) // remove the team TeamCountMap::iterator teamRef = node.team_ref_count.find(team); if (teamRef != node.team_ref_count.end()) { - PRINT(1, "NodeManager::CleanupTeam: removing %ld refs from node " - "id %ld, team %ld\n", teamRef->second, node.node_id, team); + PRINT(1, "NodeManager::CleanupTeam: removing %" B_PRId32 " refs " + "from node id %" B_PRId32 ", team %" B_PRId32 "\n", + teamRef->second, node.node_id, team); node.ref_count -= teamRef->second; if (node.ref_count == 0) { - PRINT(1, "NodeManager::CleanupTeam: removing node id %ld that " - "has no teams\n", node.node_id); + PRINT(1, "NodeManager::CleanupTeam: removing node id %" + B_PRId32 " that has no teams\n", node.node_id); fNodeMap.erase(remove); } else @@ -1122,9 +1142,10 @@ NodeManager::CleanupTeam(team_id team) TeamCountMap::iterator instanceCount = flavorInfo.team_instances_count.find(team); if (instanceCount != flavorInfo.team_instances_count.end()) { - PRINT(1, "NodeManager::CleanupTeam: removing %ld instances from " - "addon %ld, flavor %ld\n", instanceCount->second, - flavorInfo.add_on_id, flavorInfo.flavor_id); + PRINT(1, "NodeManager::CleanupTeam: removing %" B_PRId32 " " + "instances from addon %" B_PRId32 ", flavor %" B_PRId32 "\n", + instanceCount->second, flavorInfo.add_on_id, + flavorInfo.flavor_id); flavorInfo.instances_count -= instanceCount->second; if (flavorInfo.instances_count <= 0) @@ -1163,7 +1184,7 @@ NodeManager::Dump() for (PathMap::iterator iterator = fPathMap.begin(); iterator != fPathMap.end(); iterator++) { BPath path(&iterator->second); - printf(" addon-id %ld, path \"%s\"\n", iterator->first, + printf(" addon-id %" B_PRId32 ", path \"%s\"\n", iterator->first, path.InitCheck() == B_OK ? path.Path() : "INVALID"); } @@ -1177,24 +1198,27 @@ NodeManager::Dump() iterator != fNodeMap.end(); iterator++) { registered_node& node = iterator->second; - printf(" node-id %ld, addon-id %ld, addon-flavor-id %ld, port %ld, " - "creator %ld, team %ld, kinds %#08Lx, name \"%s\", ref_count %ld\n", - node.node_id, node.add_on_id, node.flavor_id, node.port, - node.creator, node.containing_team, node.kinds, node.name, - node.ref_count); + printf(" node-id %" B_PRId32 ", addon-id %" B_PRId32 ", addon-flavor-" + "id %" B_PRId32 ", port %" B_PRId32 ", creator %" B_PRId32 ", " + "team %" B_PRId32 ", kinds %#08" B_PRIx64 ", name \"%s\", " + "ref_count %" B_PRId32 "\n", node.node_id, node.add_on_id, + node.flavor_id, node.port, node.creator, node.containing_team, + node.kinds, node.name, node.ref_count); printf(" teams (refcount): "); for (TeamCountMap::iterator refsIterator = node.team_ref_count.begin(); refsIterator != node.team_ref_count.end(); refsIterator++) { - printf("%ld (%ld), ", refsIterator->first, refsIterator->second); + printf("%" B_PRId32 " (%" B_PRId32 "), ", refsIterator->first, + refsIterator->second); } printf("\n"); for (InputList::iterator inIterator = node.input_list.begin(); inIterator != node.input_list.end(); inIterator++) { media_input& input = *inIterator; - printf(" media_input: node-id %ld, node-port %ld, source-port " - "%ld, source-id %ld, dest-port %ld, dest-id %ld, name " + printf(" media_input: node-id %" B_PRId32 ", node-port %" + B_PRId32 ", source-port %" B_PRId32 ", source-id %" B_PRId32 + ", dest-port %" B_PRId32 ", dest-id %" B_PRId32 ", name " "\"%s\"\n", input.node.node, input.node.port, input.source.port, input.source.id, input.destination.port, input.destination.id, input.name); @@ -1205,8 +1229,9 @@ NodeManager::Dump() for (OutputList::iterator outIterator = node.output_list.begin(); outIterator != node.output_list.end(); outIterator++) { media_output& output = *outIterator; - printf(" media_output: node-id %ld, node-port %ld, source-port " - "%ld, source-id %ld, dest-port %ld, dest-id %ld, name " + printf(" media_output: node-id %" B_PRId32 ", node-port %" + B_PRId32 ", source-port %" B_PRId32 ", source-id %" B_PRId32 + ", dest-port %" B_PRId32 ", dest-id %" B_PRId32 ", name " "\"%s\"\n", output.node.node, output.node.port, output.source.port, output.source.id, output.destination.port, output.destination.id, output.name); @@ -1226,9 +1251,9 @@ NodeManager::Dump() iterator != fDormantFlavors.end(); iterator++) { dormant_add_on_flavor_info& flavorInfo = *iterator; - printf(" addon-id %ld, flavor-id %ld, max instances count %ld, " - "instances count %ld, info valid %s\n", - flavorInfo.add_on_id, flavorInfo.flavor_id, + printf(" addon-id %" B_PRId32 ", flavor-id %" B_PRId32 ", max " + "instances count %" B_PRId32 ", instances count %" B_PRId32 ", " + "info valid %s\n", flavorInfo.add_on_id, flavorInfo.flavor_id, flavorInfo.max_instances_count, flavorInfo.instances_count, flavorInfo.info_valid ? "yes" : "no"); printf(" teams (instances): "); @@ -1236,18 +1261,20 @@ NodeManager::Dump() = flavorInfo.team_instances_count.begin(); countIterator != flavorInfo.team_instances_count.end(); countIterator++) { - printf("%ld (%ld), ", countIterator->first, countIterator->second); + printf("%" B_PRId32 " (%" B_PRId32 "), ", countIterator->first, + countIterator->second); } printf("\n"); if (!flavorInfo.info_valid) continue; - printf(" addon-id %ld, addon-flavor-id %ld, addon-name \"%s\"\n", - flavorInfo.info.node_info.addon, + printf(" addon-id %" B_PRId32 ", addon-flavor-id %" B_PRId32 ", " + "addon-name \"%s\"\n", flavorInfo.info.node_info.addon, flavorInfo.info.node_info.flavor_id, flavorInfo.info.node_info.name); - printf(" flavor-kinds %#08Lx, flavor_flags %#08lx, internal_id %ld, " - "possible_count %ld, in_format_count %ld, out_format_count %ld\n", + printf(" flavor-kinds %#08" B_PRIx64 ", flavor_flags %#08" B_PRIx32 + ", internal_id %" B_PRId32 ", possible_count %" B_PRId32 ", " + "in_format_count %" B_PRId32 ", out_format_count %" B_PRId32 "\n", flavorInfo.info.kinds, flavorInfo.info.flavor_flags, flavorInfo.info.internal_id, flavorInfo.info.possible_count, flavorInfo.info.in_format_count, flavorInfo.info.out_format_count); @@ -1266,14 +1293,15 @@ NodeManager::Dump() status_t NodeManager::_AcquireNodeReference(media_node_id id, team_id team) { - TRACE("NodeManager::_AcquireNodeReference enter: node %ld, team %ld\n", id, - team); + TRACE("NodeManager::_AcquireNodeReference enter: node %" B_PRId32 ", team " + "%" B_PRId32 "\n", id, team); BAutolock _(this); NodeMap::iterator found = fNodeMap.find(id); if (found == fNodeMap.end()) { - ERROR("NodeManager::_AcquireNodeReference: node %ld not found\n", id); + ERROR("NodeManager::_AcquireNodeReference: node %" B_PRId32 " not " + "found\n", id); return B_ERROR; } @@ -1294,8 +1322,8 @@ NodeManager::_AcquireNodeReference(media_node_id id, team_id team) node.ref_count++; - TRACE("NodeManager::_AcquireNodeReference leave: node %ld, team %ld, " - "ref %ld, team ref %ld\n", id, team, node.ref_count, - node.team_ref_count.find(team)->second); + TRACE("NodeManager::_AcquireNodeReference leave: node %" B_PRId32 ", team " + "%" B_PRId32 ", ref %" B_PRId32 ", team ref %" B_PRId32 "\n", id, team, + node.ref_count, node.team_ref_count.find(team)->second); return B_OK; } diff --git a/src/servers/media/NotificationManager.cpp b/src/servers/media/NotificationManager.cpp index 594de04200..de6accb4f5 100644 --- a/src/servers/media/NotificationManager.cpp +++ b/src/servers/media/NotificationManager.cpp @@ -257,7 +257,7 @@ NotificationManager::CleanupTeam(team_id team) if (debugCount != 0) { ERROR("NotificationManager::CleanupTeam: removed %d notifications for " - "team %ld\n", debugCount, team); + "team %" B_PRId32 "\n", debugCount, team); } } @@ -302,9 +302,9 @@ NotificationManager::Dump() printf("NotificationManager: list of subscribers follows:\n"); Notification *n; for (fNotificationList.Rewind(); fNotificationList.GetNext(&n); ) { - printf(" team %ld, what %#08lx, node-id %ld, node-port %ld, messenger " - "%svalid\n", n->team, n->what, n->node.node, n->node.port, - n->messenger.IsValid() ? "" : "NOT "); + printf(" team %" B_PRId32 ", what %#08" B_PRIx32 ", node-id %" B_PRId32 + ", node-port %" B_PRId32 ", messenger %svalid\n", n->team, n->what, + n->node.node, n->node.port, n->messenger.IsValid() ? "" : "NOT "); } printf("NotificationManager: list end\n"); } diff --git a/src/servers/media/media_server.cpp b/src/servers/media/media_server.cpp index f1cc958a97..31a81126b4 100644 --- a/src/servers/media/media_server.cpp +++ b/src/servers/media/media_server.cpp @@ -275,7 +275,7 @@ ServerApp::_QuitAddOnServer() void ServerApp::_HandleMessage(int32 code, const void* data, size_t size) { - TRACE("ServerApp::HandleMessage %#lx enter\n", code); + TRACE("ServerApp::HandleMessage %#" B_PRIx32 " enter\n", code); switch (code) { case SERVER_CHANGE_FLAVOR_INSTANCES_COUNT: { @@ -493,7 +493,7 @@ ServerApp::_HandleMessage(int32 code, const void* data, size_t size) B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, request.area); if (clone < B_OK) { ERROR("SERVER_PUBLISH_INPUTS: failed to clone area, " - "error %#lx\n", clone); + "error %#" B_PRIx32 "\n", clone); status = clone; } else { status = gNodeManager->PublishInputs(request.node, inputs, @@ -522,7 +522,7 @@ ServerApp::_HandleMessage(int32 code, const void* data, size_t size) B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, request.area); if (clone < B_OK) { ERROR("SERVER_PUBLISH_OUTPUTS: failed to clone area, " - "error %#lx\n", clone); + "error %#" B_PRIx32 "\n", clone); status = clone; } else { status = gNodeManager->PublishOutputs(request.node, outputs, @@ -961,10 +961,10 @@ ServerApp::_HandleMessage(int32 code, const void* data, size_t size) } default: - printf("media_server: received unknown message code %#08lx\n", - code); + printf("media_server: received unknown message code %#08" B_PRIx32 + "\n", code); } - TRACE("ServerApp::HandleMessage %#lx leave\n", code); + TRACE("ServerApp::HandleMessage %#" B_PRIx32 " leave\n", code); } From 2a8d81c2913b3e23f9ea101b5a188411830a3dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 19:31:22 +0200 Subject: [PATCH 091/136] bfsinfo: fixes 64 bit warnings --- src/bin/bfs_tools/bfsinfo.cpp | 46 ++++++----- src/bin/bfs_tools/lib/BPlusTree.cpp | 13 +-- src/bin/bfs_tools/lib/Bitmap.cpp | 8 +- src/bin/bfs_tools/lib/Disk.cpp | 54 +++++++----- src/bin/bfs_tools/lib/Inode.cpp | 21 ++--- src/bin/bfs_tools/lib/bfs.h | 2 +- src/bin/bfs_tools/lib/dump.cpp | 124 +++++++++++++++------------- 7 files changed, 149 insertions(+), 119 deletions(-) diff --git a/src/bin/bfs_tools/bfsinfo.cpp b/src/bin/bfs_tools/bfsinfo.cpp index 44b64ccda4..4c9a565daf 100644 --- a/src/bin/bfs_tools/bfsinfo.cpp +++ b/src/bin/bfs_tools/bfsinfo.cpp @@ -37,10 +37,10 @@ dump_bplustree(Disk &disk, BPositionIO *file, off_t size, bool hexDump) dump_bplustree_header(header); bplustree_node *node = (bplustree_node *)(buffer + nodeSize); - while ((int32)node < (int32)buffer + size) { + while ((addr_t)node < (addr_t)buffer + size) { printf("\n\n-------------------\n" - "** node at offset: %ld\n** used: %ld bytes\n", - int32(node) - int32(buffer), node->Used()); + "** node at offset: %" B_PRIuADDR "\n** used: %" B_PRId32 " bytes" + "\n", (addr_t)node - (addr_t)buffer, node->Used()); dump_bplustree_node(node, header, &disk); if (hexDump) { @@ -48,7 +48,7 @@ dump_bplustree(Disk &disk, BPositionIO *file, off_t size, bool hexDump) dump_block((char *)node, header->node_size, 0); } - node = (bplustree_node *)(int32(node) + nodeSize); + node = (bplustree_node *)((addr_t)node + nodeSize); } } @@ -79,11 +79,11 @@ dump_indirect_stream(Disk &disk, bfs_inode *node, bool showOffsets) if (runs[i].IsZero()) return; - printf(" indirect[%02ld] = ", i); + printf(" indirect[%02" B_PRId32 "] = ", i); char buffer[256]; if (showOffsets) - snprintf(buffer, sizeof(buffer), " %16lld", offset); + snprintf(buffer, sizeof(buffer), " %16" B_PRIdOFF, offset); else buffer[0] = '\0'; @@ -184,25 +184,27 @@ main(int argc, char **argv) printf(" Name:\t\t\t\"%s\"\n", disk.SuperBlock()->name); printf(" (disk is %s)\n\n", disk.ValidateSuperBlock() == B_OK ? "valid" : "invalid!!"); - printf(" Block Size:\t\t%ld bytes\n", disk.BlockSize()); - printf(" Number of Blocks:\t%12Lu\t%10g MB\n", disk.NumBlocks(), - disk.NumBlocks() * disk.BlockSize() / (1024.0*1024)); + printf(" Block Size:\t\t%" B_PRIu32 " bytes\n", disk.BlockSize()); + printf(" Number of Blocks:\t%12" B_PRIdOFF "\t%10g MB\n", + disk.NumBlocks(), disk.NumBlocks() * disk.BlockSize() + / (1024.0*1024)); if (disk.BlockBitmap() != NULL) { - printf(" Used Blocks:\t\t%12Lu\t%10g MB\n", + printf(" Used Blocks:\t\t%12" B_PRIdOFF "\t%10g MB\n", disk.BlockBitmap()->UsedBlocks(), disk.BlockBitmap()->UsedBlocks() * disk.BlockSize() / (1024.0*1024)); - printf(" Free Blocks:\t\t%12Lu\t%10g MB\n", + printf(" Free Blocks:\t\t%12" B_PRIdOFF "\t%10g MB\n", disk.BlockBitmap()->FreeBlocks(), disk.BlockBitmap()->FreeBlocks() * disk.BlockSize() / (1024.0*1024)); } int32 size = (disk.AllocationGroups() * disk.SuperBlock()->blocks_per_ag); - printf(" Bitmap Size:\t\t%ld bytes (%ld blocks, %ld per allocation " - "group)\n", disk.BlockSize() * size, size, + printf(" Bitmap Size:\t\t%" B_PRIu32 " bytes (%" B_PRId32 " blocks, %" + B_PRId32 " per allocation group)\n", disk.BlockSize() * size, size, disk.SuperBlock()->blocks_per_ag); - printf(" Allocation Groups:\t%lu\n\n", disk.AllocationGroups()); + printf(" Allocation Groups:\t%" B_PRIu32 "\n\n", + disk.AllocationGroups()); dump_block_run(" Log:\t\t\t", disk.Log()); printf(" (was %s)\n\n", disk.SuperBlock()->flags == SUPER_BLOCK_CLEAN ? "cleanly unmounted" : "not unmounted cleanly!"); @@ -260,8 +262,8 @@ main(int argc, char **argv) } if (dumpInode) { - printf("Inode at block %Ld:\n-----------------------------------------" - "\n", disk.ToBlock(run)); + printf("Inode at block %" B_PRIdOFF ":\n------------------------------" + "-----------\n", disk.ToBlock(run)); dump_inode(inode, (bfs_inode *)buffer, showOffsets); dump_indirect_stream(disk, (bfs_inode *)buffer, showOffsets); dump_small_data(inode); @@ -269,8 +271,8 @@ main(int argc, char **argv) } if (dumpBTree && inode) { - printf("B+Tree at block %Ld:\n----------------------------------------" - "-\n", disk.ToBlock(run)); + printf("B+Tree at block %" B_PRIdOFF ":\n-----------------------------" + "------------\n", disk.ToBlock(run)); if (inode->IsDirectory() || inode->IsAttributeDirectory()) { dump_bplustree(disk, (Directory *)inode, inode->Size(), dumpHex); putchar('\n'); @@ -279,8 +281,8 @@ main(int argc, char **argv) } if (validateBTree && inode) { - printf("Validating B+Tree at block %Ld:\n-----------------------------" - "------------\n", disk.ToBlock(run)); + printf("Validating B+Tree at block %" B_PRIdOFF ":\n------------------" + "-----------------------\n", disk.ToBlock(run)); if (inode->IsDirectory() || inode->IsAttributeDirectory()) { BPlusTree *tree; if (((Directory *)inode)->GetTree(&tree) == B_OK) { @@ -294,8 +296,8 @@ main(int argc, char **argv) } if (dumpHex) { - printf("Hexdump from inode at block %Ld:\n-----------------------------" - "------------\n", disk.ToBlock(run)); + printf("Hexdump from inode at block %" B_PRIdOFF ":\n-----------------" + "------------------------\n", disk.ToBlock(run)); dump_block(buffer, disk.BlockSize()); putchar('\n'); } diff --git a/src/bin/bfs_tools/lib/BPlusTree.cpp b/src/bin/bfs_tools/lib/BPlusTree.cpp index 9493593332..60255ebd4f 100644 --- a/src/bin/bfs_tools/lib/BPlusTree.cpp +++ b/src/bin/bfs_tools/lib/BPlusTree.cpp @@ -250,14 +250,14 @@ BPlusTree::Validate(bool verbose) while (true) { if (!stack.Pop(&info)) { if (verbose) { - printf(" %ld B+tree node(s) processed (%ld free node(s)).\n", - count, freeCount); + printf(" %" B_PRId32 " B+tree node(s) processed (%" B_PRId32 + " free node(s)).\n", count, freeCount); } return B_OK; } if (!info.free && verbose && ++count % 10 == 0) - printf(" %ld%s1A\n", count, escape); + printf(" %" B_PRId32 "%s1A\n", count, escape); else if (info.free) freeCount++; @@ -265,7 +265,9 @@ BPlusTree::Validate(bool verbose) if ((node = fCache.Get(info.offset)) == NULL || !info.free && !CheckNode(node)) { if (verbose) { - fprintf(stderr," B+Tree: Could not get data at position %Ld (referenced by node at %Ld)\n",info.offset,info.from); + fprintf(stderr," B+Tree: Could not get data at position %" + B_PRIdOFF " (referenced by node at %" B_PRIdOFF ")\n", + info.offset, info.from); if ((node = fCache.Get(info.from)) != NULL) dump_bplustree_node(node,fHeader); } @@ -350,7 +352,8 @@ status_t BPlusTree::Goto(int8 to) else { if (node->all_key_length > fNodeSize - || (uint32)node->Values() > (uint32)node + fNodeSize - 8 * node->all_key_count) + || (addr_t)node->Values() > (addr_t)node + fNodeSize + - 8 * node->all_key_count) return B_ERROR; pos = *node->Values(); diff --git a/src/bin/bfs_tools/lib/Bitmap.cpp b/src/bin/bfs_tools/lib/Bitmap.cpp index 53567dadca..8fbe8c439c 100644 --- a/src/bin/bfs_tools/lib/Bitmap.cpp +++ b/src/bin/bfs_tools/lib/Bitmap.cpp @@ -138,8 +138,8 @@ Bitmap::BackupSetAt(off_t block, bool used) { uint32 index = block / 32; if (index > fByteSize / 4) { - fprintf(stderr, "Bitmap::BackupSetAt(): Block %Ld outside bitmap!\n", - block); + fprintf(stderr, "Bitmap::BackupSetAt(): Block %" B_PRIdOFF " outside " + "bitmap!\n", block); return false; } @@ -251,7 +251,9 @@ Bitmap::CompareWithBackup() { for (int32 i = fByteSize / 4;i-- > 0;) { if (fBitmap[i] != fBackupBitmap[i]) { - printf("differ at %ld (block %ld) -> bitmap = %08lx, backup = %08lx\n",i,i*32,fBitmap[i],fBackupBitmap[i]); + printf("differ at %" B_PRId32 " (block %" B_PRId32 ") -> bitmap = " + "%08" B_PRIx32 ", backup = %08" B_PRIx32 "\n", i, i * 32, + fBitmap[i], fBackupBitmap[i]); } } return B_OK; diff --git a/src/bin/bfs_tools/lib/Disk.cpp b/src/bin/bfs_tools/lib/Disk.cpp index 5d0fd07f73..b082938ea6 100644 --- a/src/bin/bfs_tools/lib/Disk.cpp +++ b/src/bin/bfs_tools/lib/Disk.cpp @@ -147,8 +147,10 @@ Disk::Disk(const char *deviceName, bool rawMode, off_t start, off_t stop) } close(device); - if (fSize == 0LL) - fprintf(stderr,"Disk: Invalid file size (%Ld bytes)!\n",fSize); + if (fSize == 0LL) { + fprintf(stderr,"Disk: Invalid file size (%" B_PRIdOFF " bytes)!\n", + fSize); + } if (rawMode && ScanForSuperBlock(start, stop) < B_OK) { fFile.Unset(); @@ -240,7 +242,8 @@ Disk::DumpBootBlockToFile() status_t Disk::ScanForSuperBlock(off_t start, off_t stop) { - printf("Disk size %Ld bytes, %.2f GB\n", fSize, 1.0 * fSize / (1024*1024*1024)); + printf("Disk size %" B_PRIdOFF " bytes, %.2f GB\n", fSize, 1.0 * fSize + / (1024*1024*1024)); uint32 blockSize = 4096; char buffer[blockSize + 1024]; @@ -252,12 +255,15 @@ Disk::ScanForSuperBlock(off_t start, off_t stop) BList superBlocks; - printf("Scanning Disk from %Ld to %Ld\n", start, stop); + printf("Scanning Disk from %" B_PRIdOFF " to %" B_PRIdOFF "\n", start, + stop); for (off_t offset = start; offset < stop; offset += blockSize) { - if (((offset-start) % (blockSize * 100)) == 0) - printf(" %12Ld, %.2f GB %s1A\n",offset,1.0 * offset / (1024*1024*1024),escape); + if (((offset-start) % (blockSize * 100)) == 0) { + printf(" %12" B_PRIdOFF ", %.2f GB %s1A\n", offset, + 1.0 * offset / (1024*1024*1024),escape); + } ssize_t bytes = fBufferedFile->ReadAt(offset, buffer, blockSize + 1024); if (bytes < B_OK) @@ -274,7 +280,8 @@ Disk::ScanForSuperBlock(off_t start, off_t stop) && super->magic2 == (int32)SUPER_BLOCK_MAGIC2 && super->magic3 == (int32)SUPER_BLOCK_MAGIC3) { - printf("\n(%ld) *** BFS superblock found at: %Ld\n",superBlocks.CountItems() + 1,offset); + printf("\n(%" B_PRId32 ") *** BFS superblock found at: %" + B_PRIdOFF "\n", superBlocks.CountItems() + 1, offset); dump_super_block(super); // add a copy of the superblock to the list @@ -302,9 +309,10 @@ Disk::ScanForSuperBlock(off_t start, off_t stop) for (int32 i = 0; i < superBlocks.CountItems(); i++) { bfs_disk_info *info = (bfs_disk_info *)superBlocks.ItemAt(i); - printf("%ld) %s, offset %Ld, size %g GB (%svalid)\n", i + 1, - info->super_block.name, info->offset, - 1.0 * info->super_block.num_blocks * info->super_block.block_size / (1024*1024*1024), + printf("%" B_PRId32 ") %s, offset %" B_PRIdOFF ", size %g GB (%svalid)" + "\n", i + 1, info->super_block.name, info->offset, + 1.0 * info->super_block.num_blocks * info->super_block.block_size + / (1024*1024*1024), ValidateSuperBlock(info->super_block) < B_OK ? "in" : ""); } @@ -375,7 +383,7 @@ Disk::ValidateSuperBlock() status_t Disk::RecreateSuperBlock() { - memset(&fSuperBlock,0,sizeof(disk_super_block)); + memset(&fSuperBlock, 0, sizeof(disk_super_block)); puts("\n*** Determine block size"); @@ -383,7 +391,7 @@ Disk::RecreateSuperBlock() if (status < B_OK) return status; - printf("\tblock size = %ld\n",BlockSize()); + printf("\tblock size = %" B_PRId32 "\n", BlockSize()); strcpy(fSuperBlock.name,"recovered"); fSuperBlock.magic1 = SUPER_BLOCK_MAGIC1; @@ -450,7 +458,7 @@ Disk::RecreateSuperBlock() if (fLogStart != ((indexDir.inode_num.allocation_group << fSuperBlock.ag_shift) + indexDir.inode_num.start - LogSize())) { fprintf(stderr,"ERROR: start of logging area doesn't fit assumed value " - "(%Ld blocks before indices)!\n", LogSize()); + "(%" B_PRIdOFF " blocks before indices)!\n", LogSize()); //gErrors++; } @@ -492,8 +500,8 @@ Disk::DetermineBlockSize() // read a quarter of the drive at maximum for (; offset < (fSize >> 2); offset += 1024) { if (fBufferedFile->ReadAt(offset, buffer, sizeof(buffer)) < B_OK) { - fprintf(stderr, "could not read from device (offset = %Ld, " - "size = %ld)!\n", offset, sizeof(buffer)); + fprintf(stderr, "could not read from device (offset = %" B_PRIdOFF + ", size = %ld)!\n", offset, sizeof(buffer)); status = B_IO_ERROR; break; } @@ -551,7 +559,8 @@ Disk::GetNextSpecialInode(char *buffer, off_t *_offset, off_t end, for (; offset < end; offset += BlockSize()) { if (fBufferedFile->ReadAt(offset, buffer, 1024) < B_OK) { - fprintf(stderr,"could not read from device (offset = %Ld, size = %d)!\n",offset,1024); + fprintf(stderr,"could not read from device (offset = %" B_PRIdOFF + ", size = %d)!\n", offset, 1024); *_offset = offset; return B_IO_ERROR; } @@ -576,7 +585,7 @@ Disk::GetNextSpecialInode(char *buffer, off_t *_offset, off_t end, // is the inode a special root inode (parent == self)? if (!memcmp(&inode->parent, &inode->inode_num, sizeof(inode_addr))) { - printf("\t special inode found at %Ld\n", offset); + printf("\t special inode found at %" B_PRIdOFF "\n", offset); *_offset = offset; return B_OK; @@ -596,10 +605,12 @@ Disk::SaveInode(bfs_inode *inode, bool *indices, bfs_inode *indexDir, printf("\troot node found!\n"); if (inode->inode_num.allocation_group != 8 || inode->inode_num.start != 0 - || inode->inode_num.length != 1) - printf("WARNING: root node has unexpected position: (ag = %ld, " - "start = %d, length = %d)\n", inode->inode_num.allocation_group, + || inode->inode_num.length != 1) { + printf("WARNING: root node has unexpected position: (ag = %" + B_PRId32 ", start = %d, length = %d)\n", + inode->inode_num.allocation_group, inode->inode_num.start, inode->inode_num.length); + } if (rootDir) memcpy(rootDir, inode, sizeof(bfs_inode)); } else if (inode->mode & S_INDEX_DIR) { @@ -662,7 +673,8 @@ Disk::ScanForIndexAndRoot(bfs_inode *indexDir,bfs_inode *rootDir) { SaveInode(inode,&indices,indexDir,&root,rootDir); - printf("root node at: 0x%Lx (DiskProbe)\n",logOffset / 512); + printf("root node at: 0x%" B_PRIxOFF " (DiskProbe)\n", + logOffset / 512); //fBufferedFile->ReadAt(logOffset + BlockSize(),buffer,1024); //if (*(uint32 *)buffer == BPLUSTREE_MAGIC) //{ diff --git a/src/bin/bfs_tools/lib/Inode.cpp b/src/bin/bfs_tools/lib/Inode.cpp index 4fab2fd07b..f13b615cc9 100644 --- a/src/bin/bfs_tools/lib/Inode.cpp +++ b/src/bin/bfs_tools/lib/Inode.cpp @@ -276,17 +276,18 @@ Inode::SetName(const char *name) int32 oldLength = nameData == NULL ? 0 : nameData->data_size; int32 newLength = strlen(name) + (nameData == NULL ? sizeof(small_data) + 5 : 0); - if (int32(data) + newLength - oldLength >= (int32)(fInode + fDisk->BlockSize())) + if ((addr_t)data + newLength - oldLength >= (addr_t)(fInode + + fDisk->BlockSize())) return B_NO_MEMORY; if (nameData == NULL) { memmove(newLength + (uint8 *)fInode->small_data_start, fInode->small_data_start, - int32(data) - int32(fInode->small_data_start)); + (addr_t)data - (addr_t)fInode->small_data_start); nameData = fInode->small_data_start; } else { memmove(newLength + (uint8 *)nameData, nameData, - int32(data) - int32(fInode->small_data_start)); + (addr_t)data - (addr_t)fInode->small_data_start); } memset(nameData, 0, sizeof(small_data) + 5 + strlen(name)); @@ -766,7 +767,7 @@ DataStream::ReadAt(off_t pos, void *buffer, size_t size) //printf("DataStream::ReadAt(pos = %Ld,buffer = %p,size = %ld);\n",pos,buffer,size); // truncate size to read - if (pos + size > fInode->data.size) { + if (pos + (off_t)size > fInode->data.size) { if (pos > fInode->data.size) // reading outside the file return B_ERROR; @@ -782,14 +783,14 @@ DataStream::ReadAt(off_t pos, void *buffer, size_t size) if (status < B_OK) return status; - ssize_t bytes = min_c(size, fRunBlockEnd - pos); + ssize_t bytes = min_c((off_t)size, fRunBlockEnd - pos); //printf("### read %ld bytes from %Ld\n### --\n",bytes,fDisk->ToOffset(fRun) + pos - fRunFileOffset); bytes = fDisk->ReadAt(fDisk->ToOffset(fRun) + pos - fRunFileOffset, buffer, bytes); if (bytes <= 0) { if (bytes == 0) { - printf("could not read bytes at: %ld,%d\n", + printf("could not read bytes at: %" B_PRId32 ",%d\n", fRun.allocation_group, fRun.start); } return bytes < 0 ? bytes : B_BAD_DATA; @@ -813,7 +814,7 @@ DataStream::WriteAt(off_t pos, const void *buffer, size_t size) NodeGetter _(this); // FIXME: truncate size -> should enlargen the file - if (pos + size > fInode->data.size) { + if (pos + (off_t)size > fInode->data.size) { if (pos > fInode->data.size) // writing outside the file return B_ERROR; @@ -829,7 +830,7 @@ DataStream::WriteAt(off_t pos, const void *buffer, size_t size) if (status < B_OK) return status; - ssize_t bytes = min_c(size,fRunBlockEnd - pos); + ssize_t bytes = min_c((off_t)size, fRunBlockEnd - pos); //printf("### write %ld bytes to %Ld\n### --\n",bytes,fDisk->ToOffset(fRun) + pos - fRunFileOffset); bytes = fDisk->WriteAt(fDisk->ToOffset(fRun) + pos - fRunFileOffset,buffer,bytes); @@ -959,8 +960,8 @@ File::CopyTo(const char *root, bool fullPath, Inode::Source *source) << (int32)BlockRun().start; path.Append(sub.String()); } - printf("%ld,%d -> %s\n", BlockRun().allocation_group, BlockRun().start, - path.Path()); + printf("%" B_PRId32 ",%d -> %s\n", BlockRun().allocation_group, + BlockRun().start, path.Path()); BFile file; status = file.SetTo(path.Path(), diff --git a/src/bin/bfs_tools/lib/bfs.h b/src/bin/bfs_tools/lib/bfs.h index f2ac852b4b..224e3a0ef3 100644 --- a/src/bin/bfs_tools/lib/bfs.h +++ b/src/bin/bfs_tools/lib/bfs.h @@ -251,7 +251,7 @@ inline small_data *small_data::Next() inline bool small_data::IsLast(bfs_inode *inode) { - return (uint32)this > (uint32)inode + inode->inode_size - sizeof(small_data) + return (addr_t)this > (addr_t)inode + inode->inode_size - sizeof(small_data) || name_size == 0; } diff --git a/src/bin/bfs_tools/lib/dump.cpp b/src/bin/bfs_tools/lib/dump.cpp index 651eeda5fa..caaf851562 100644 --- a/src/bin/bfs_tools/lib/dump.cpp +++ b/src/bin/bfs_tools/lib/dump.cpp @@ -38,7 +38,7 @@ get_tupel(uint32 id) void dump_block_run(const char *prefix, const block_run &run, const char *postfix) { - Print("%s(%ld, %d, %d)%s\n", prefix, run.allocation_group, + Print("%s(%" B_PRId32 ", %d, %d)%s\n", prefix, run.allocation_group, run.start, run.length, postfix); } @@ -48,29 +48,29 @@ dump_super_block(const disk_super_block *superBlock) { Print("disk_super_block:\n"); Print(" name = %s\n", superBlock->name); - Print(" magic1 = %#08lx (%s) %s\n", superBlock->magic1, + Print(" magic1 = %#08" B_PRIx32 " (%s) %s\n", superBlock->magic1, get_tupel(superBlock->magic1), superBlock->magic1 == SUPER_BLOCK_MAGIC1 ? "valid" : "INVALID"); - Print(" fs_byte_order = %#08lx (%s, %s endian)\n", + Print(" fs_byte_order = %#08" B_PRIx32 " (%s, %s endian)\n", superBlock->fs_byte_order, get_tupel(superBlock->fs_byte_order), superBlock->fs_byte_order == SUPER_BLOCK_FS_LENDIAN ? "little" : "big"); - Print(" block_size = %lu\n", superBlock->block_size); - Print(" block_shift = %lu\n", superBlock->block_shift); - Print(" num_blocks = %Lu\n", superBlock->num_blocks); - Print(" used_blocks = %Lu\n", superBlock->used_blocks); - Print(" inode_size = %lu\n", superBlock->inode_size); - Print(" magic2 = %#08lx (%s) %s\n", superBlock->magic2, + Print(" block_size = %" B_PRIu32 "\n", superBlock->block_size); + Print(" block_shift = %" B_PRIu32 "\n", superBlock->block_shift); + Print(" num_blocks = %" B_PRIdOFF "\n", superBlock->num_blocks); + Print(" used_blocks = %" B_PRIdOFF "\n", superBlock->used_blocks); + Print(" inode_size = %" B_PRId32 "\n", superBlock->inode_size); + Print(" magic2 = %#08" B_PRIx32 " (%s) %s\n", superBlock->magic2, get_tupel(superBlock->magic2), superBlock->magic2 == (int)SUPER_BLOCK_MAGIC2 ? "valid" : "INVALID"); - Print(" blocks_per_ag = %lu\n", superBlock->blocks_per_ag); - Print(" ag_shift = %lu\n", superBlock->ag_shift); - Print(" num_ags = %lu\n", superBlock->num_ags); - Print(" flags = %#08lx (%s)\n", superBlock->flags, + Print(" blocks_per_ag = %" B_PRId32 "\n", superBlock->blocks_per_ag); + Print(" ag_shift = %" B_PRId32 "\n", superBlock->ag_shift); + Print(" num_ags = %" B_PRId32 "\n", superBlock->num_ags); + Print(" flags = %#08" B_PRIx32 " (%s)\n", superBlock->flags, get_tupel(superBlock->flags)); dump_block_run(" log_blocks = ", superBlock->log_blocks); - Print(" log_start = %Lu\n", superBlock->log_start); - Print(" log_end = %Lu\n", superBlock->log_end); - Print(" magic3 = %#08lx (%s) %s\n", superBlock->magic3, + Print(" log_start = %" B_PRIdOFF "\n", superBlock->log_start); + Print(" log_end = %" B_PRIdOFF "\n", superBlock->log_end); + Print(" magic3 = %#08" B_PRIx32 " (%s) %s\n", superBlock->magic3, get_tupel(superBlock->magic3), superBlock->magic3 == SUPER_BLOCK_MAGIC3 ? "valid" : "INVALID"); dump_block_run(" root_dir = ", superBlock->root_dir); @@ -91,7 +91,7 @@ dump_data_stream(const bfs_inode *inode, const data_stream *stream, bool showOff char buffer[256]; if (showOffsets) - snprintf(buffer, sizeof(buffer), " %16lld", offset); + snprintf(buffer, sizeof(buffer), " %16" B_PRIdOFF, offset); else buffer[0] = '\0'; @@ -100,21 +100,23 @@ dump_data_stream(const bfs_inode *inode, const data_stream *stream, bool showOff offset += stream->direct[i].length * inode->inode_size; } } - Print(" max_direct_range = %Lu\n", stream->max_direct_range); + Print(" max_direct_range = %" B_PRIdOFF "\n", + stream->max_direct_range); if (!stream->indirect.IsZero()) dump_block_run(" indirect = ", stream->indirect); - Print(" max_indirect_range = %Lu\n", stream->max_indirect_range); + Print(" max_indirect_range = %" B_PRIdOFF "\n", + stream->max_indirect_range); if (!stream->double_indirect.IsZero()) { dump_block_run(" double_indirect = ", stream->double_indirect); } - Print(" max_double_indirect_range = %Lu\n", + Print(" max_double_indirect_range = %" B_PRIdOFF "\n", stream->max_double_indirect_range); - Print(" size = %Lu\n", stream->size); + Print(" size = %" B_PRIdOFF "\n", stream->size); } @@ -126,13 +128,14 @@ dump_inode(const Inode *nameNode, const bfs_inode *inode, bool showOffsets) else Print("inode:\n"); - Print(" magic1 = %08lx (%s) %s\n",inode->magic1, - get_tupel(inode->magic1), (inode->magic1 == INODE_MAGIC1 ? "valid" : "INVALID")); + Print(" magic1 = %08" B_PRIx32 " (%s) %s\n",inode->magic1, + get_tupel(inode->magic1), + (inode->magic1 == INODE_MAGIC1 ? "valid" : "INVALID")); dump_block_run( " inode_num = ",inode->inode_num); - Print(" uid = %lu\n",inode->uid); - Print(" gid = %lu\n",inode->gid); - Print(" mode = %10lo (octal)\n",inode->mode); - Print(" flags = %08lx\n",inode->flags); + Print(" uid = %" B_PRIu32 "\n",inode->uid); + Print(" gid = %" B_PRIu32 "\n",inode->gid); + Print(" mode = %10" B_PRIo32 " (octal)\n",inode->mode); + Print(" flags = %08" B_PRIx32 "\n",inode->flags); time_t time; time = (time_t)(inode->create_time >> 16); @@ -142,9 +145,9 @@ dump_inode(const Inode *nameNode, const bfs_inode *inode, bool showOffsets) dump_block_run( " parent = ",inode->parent); dump_block_run( " attributes = ",inode->attributes); - Print(" type = %lu\n",inode->type); - Print(" inode_size = %lu\n",inode->inode_size); - Print(" etc = %#08lx\n",inode->etc); + Print(" type = %" B_PRIu32 "\n",inode->type); + Print(" inode_size = %" B_PRId32 "\n",inode->inode_size); + Print(" etc = %#08" B_PRIx32 "\n",inode->etc); Print(" short_symlink = %s\n", S_ISLNK(inode->mode) && (inode->flags & INODE_LONG_SYMLINK) == 0 ? inode->short_symlink : "-"); @@ -172,7 +175,8 @@ dump_small_data(Inode *inode) inode->InodeBuffer()->inode_size - sizeof(struct bfs_inode)); while (inode->GetNextSmallData(&item) == B_OK) { - printf("%#08lx (%s), name = \"%s\", ", item->type, get_tupel(item->type), item->Name()); + printf("%#08" B_PRIx32 " (%s), name = \"%s\", ", item->type, + get_tupel(item->type), item->Name()); if (item->type == FILE_NAME_TYPE || item->type == B_STRING_TYPE || item->type == B_MIME_STRING_TYPE) @@ -187,15 +191,19 @@ void dump_bplustree_header(const bplustree_header* header) { printf("bplustree_header:\n"); - printf(" magic = %#08lx (%s) %s\n", header->magic, - get_tupel(header->magic), + printf(" magic = %#08" B_PRIx32 " (%s) %s\n", + header->magic, get_tupel(header->magic), header->magic == BPLUSTREE_MAGIC ? "valid" : "INVALID"); - printf(" node_size = %lu\n", header->node_size); - printf(" max_number_of_levels = %lu\n", header->max_number_of_levels); - printf(" data_type = %lu\n", header->data_type); - printf(" root_node_pointer = %Ld\n", header->root_node_pointer); - printf(" free_node_pointer = %Ld\n", header->free_node_pointer); - printf(" maximum_size = %Lu\n", header->maximum_size); + printf(" node_size = %" B_PRIu32 "\n", header->node_size); + printf(" max_number_of_levels = %" B_PRIu32 "\n", + header->max_number_of_levels); + printf(" data_type = %" B_PRIu32 "\n", header->data_type); + printf(" root_node_pointer = %" B_PRIdOFF "\n", + header->root_node_pointer); + printf(" free_node_pointer = %" B_PRIdOFF "\n", + header->free_node_pointer); + printf(" maximum_size = %" B_PRIdOFF "\n", + header->maximum_size); } @@ -205,9 +213,9 @@ dump_bplustree_node(const bplustree_node* node, const bplustree_header* header, { Print("bplustree_node (%s node):\n", node->overflow_link == BPLUSTREE_NULL ? "leaf" : "index"); - Print(" left_link = %Ld\n", node->left_link); - Print(" right_link = %Ld\n", node->right_link); - Print(" overflow_link = %Ld\n", node->overflow_link); + Print(" left_link = %" B_PRIdOFF "\n", node->left_link); + Print(" right_link = %" B_PRIdOFF "\n", node->right_link); + Print(" overflow_link = %" B_PRIdOFF "\n", node->overflow_link); Print(" all_key_count = %u\n", node->all_key_count); Print(" all_key_length = %u\n", node->all_key_length); @@ -226,7 +234,7 @@ dump_bplustree_node(const bplustree_node* node, const bplustree_header* header, uint16 length; char* key = (char *)node->KeyAt(i, &length); if (length > 255) { - Print(" %2ld. Invalid length (%u)!!\n", i, length); + Print(" %2" B_PRId32 ". Invalid length (%u)!!\n", i, length); dump_block((char *)node, header->node_size, sizeof(off_t)); break; } @@ -236,33 +244,35 @@ dump_bplustree_node(const bplustree_node* node, const bplustree_header* header, buffer[length] = '\0'; off_t *value = node->Values() + i; - if ((uint32)value < (uint32)node || (uint32)value > (uint32)node + header->node_size) - Print(" %2ld. Invalid Offset!!\n",i); - else { - Print(" %2ld. ",i); + if ((addr_t)value < (addr_t)node + || (addr_t)value > (addr_t)node + header->node_size) { + Print(" %2" B_PRId32 ". Invalid Offset!!\n", i); + } else { + Print(" %2" B_PRId32 ". ",i); if (header->data_type == BPLUSTREE_STRING_TYPE) Print("\"%s\"",buffer); else if (header->data_type == BPLUSTREE_INT32_TYPE) { - Print("int32 = %ld (0x%lx)", *(int32 *)&buffer, - *(int32 *)&buffer); + Print("int32 = %" B_PRId32 " (0x%" B_PRIx32 ")", + *(int32 *)&buffer, *(int32 *)&buffer); } else if (header->data_type == BPLUSTREE_UINT32_TYPE) { - Print("uint32 = %lu (0x%lx)", *(uint32 *)&buffer, - *(uint32 *)&buffer); + Print("uint32 = %" B_PRIu32 " (0x%" B_PRIx32 ")", + *(uint32 *)&buffer, *(uint32 *)&buffer); } else if (header->data_type == BPLUSTREE_INT64_TYPE) { - Print("int64 = %Ld (0x%Lx)", *(int64 *)&buffer, - *(int64 *)&buffer); + Print("int64 = %" B_PRId64 " (0x%" B_PRIx64 ")", + *(int64 *)&buffer, *(int64 *)&buffer); } else Print("???"); off_t offset = *value & 0x3fffffffffffffffLL; - Print(" (%d bytes) -> %Ld",length,offset); + Print(" (%d bytes) -> %" B_PRIdOFF,length,offset); if (disk != NULL) { block_run run = disk->ToBlockRun(offset); - Print(" (%ld, %d)", run.allocation_group, run.start); + Print(" (%" B_PRId32 ", %d)", run.allocation_group, run.start); } if (bplustree_node::LinkType(*value) == BPLUSTREE_DUPLICATE_FRAGMENT) { - Print(" (duplicate fragment %Ld)\n", *value & 0x3ff); + Print(" (duplicate fragment %" B_PRIdOFF ")\n", + *value & 0x3ff); } else if (bplustree_node::LinkType(*value) == BPLUSTREE_DUPLICATE_NODE) { Print(" (duplicate node)\n"); @@ -310,7 +320,7 @@ dump_block(const char *buffer, uint32 size, int8 valueSize) for (uint32 offset = start; offset < start + kBlockSize; offset += valueSize) { if (valueSize == sizeof(off_t)) - Print("%s%Ld", offset == start ? "" : ", ", + Print("%s%" B_PRIdOFF, offset == start ? "" : ", ", *(off_t *)(buffer + offset)); } Print(")"); From aff59d31a3dd3b6755347f5784c8e8cb57aee260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 19:42:24 +0200 Subject: [PATCH 092/136] hey: fixes 64 bit warnings --- src/bin/hey.cpp | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/bin/hey.cpp b/src/bin/hey.cpp index b311ea353b..ac464bef00 100644 --- a/src/bin/hey.cpp +++ b/src/bin/hey.cpp @@ -164,11 +164,16 @@ parse(BMessenger& the_application, int argc, char *argv[], int32 argapp) } else { if (the_reply.what == (uint32)B_MESSAGE_NOT_UNDERSTOOD || the_reply.what==(uint32)B_ERROR){ // I do it myself if (the_reply.HasString("message")){ - if (!silent) - printf("%s (error 0x%8lX)\n", the_reply.FindString("message"), the_reply.FindInt32("error")); + if (!silent) { + printf("%s (error 0x%8" B_PRIx32 ")\n", + the_reply.FindString("message"), + the_reply.FindInt32("error")); + } } else { - if (!silent) - printf("error 0x%8lX\n", the_reply.FindInt32("error")); + if (!silent) { + printf("error 0x%8" B_PRIx32 "\n", + the_reply.FindInt32("error")); + } } return 1; } else { @@ -187,7 +192,7 @@ parse(BMessenger& the_application, int argc, char *argv[], int32 argapp) } else if(tc==B_INT32_TYPE){ int32 v; the_reply.FindInt32("result", &v); - printf("%ld\n", v); + printf("%" B_PRId32 "\n", v); } else if(tc==B_UINT8_TYPE){ uint8 v; the_reply.FindInt8("result", (int8*)&v); @@ -199,7 +204,7 @@ parse(BMessenger& the_application, int argc, char *argv[], int32 argapp) } else if(tc==B_UINT32_TYPE){ uint32 v; the_reply.FindInt32("result", (int32*)&v); - printf("%lu\n", v); + printf("%" B_PRIu32 "\n", v); } else if(tc==B_STRING_TYPE){ const char* v; the_reply.FindString("result", &v); @@ -288,8 +293,8 @@ main(int argc, char *argv[]) be_roster->GetAppList(&team_list); - for (int32 i=0; iGetRunningAppInfo(teamid, &appinfo); if (strcmp(appinfo.signature, argv[argapp])==0){ the_application=BMessenger(appinfo.signature); @@ -479,7 +484,7 @@ Hey(BMessenger* target, char* argv[], int32* argx, int32 argc, BMessage* reply) // if all goes well, rply contains all kinds of property infos int32 j=0; void *voidptr; - int32 sizefound; + ssize_t sizefound; BPropertyInfo propinfo; const value_info *vinfo; int32 vinfo_index, vinfo_count; @@ -958,8 +963,9 @@ void add_message_contents(BList *textlist, BMessage *msg, int32 level) { int32 count; - int32 i, sizefound, j; - ulong typefound; + int32 i, j; + type_code typefound; + ssize_t sizefound; #ifdef HAIKU_TARGET_PLATFORM_DANO const char *namefound; #else @@ -1178,14 +1184,15 @@ format_data(int32 type, char *ptr, long size) case B_INT64_TYPE: str = new char[64]; i64 = *(int64*)ptr; - sprintf(str, "%Ld (0x%LX)", i64, i64); + sprintf(str, "%" B_PRId64 " (0x%" B_PRIx64 ")", i64, i64); break; case B_SIZE_T_TYPE: case B_INT32_TYPE: str = new char[64]; i32 = *(int32*)ptr; - sprintf(str, "%ld (0x%08lX)", i32, i32); + sprintf(str, "%" B_PRId32 " (0x%08" B_PRId32 ")", i32, + i32); break; case B_INT16_TYPE: @@ -1204,13 +1211,15 @@ format_data(int32 type, char *ptr, long size) case B_UINT64_TYPE: str = new char[64]; ui64 = *(uint64*)ptr; - sprintf(str, "%Lu (0x%LX)", ui64, ui64); + sprintf(str, "%" B_PRIu64 " (0x%" B_PRIx64 ")", ui64, + ui64); break; case B_UINT32_TYPE: str = new char[64]; ui32 = *(uint32*)ptr; - sprintf(str, "%lu (0x%08lX)", ui32, ui32); + sprintf(str, "%" B_PRIu32 " (0x%08" B_PRIx32 ")", ui32, + ui32); break; case B_UINT16_TYPE: @@ -1394,7 +1403,8 @@ format_data(int32 type, char *ptr, long size) strcat(str, vinfo[vinfo_index].name); strcat(str, " "); - sprintf(str+strlen(str), "0x%8lX (", vinfo[vinfo_index].value); + sprintf(str+strlen(str), "0x%8" B_PRIx32 " (", + vinfo[vinfo_index].value); id_to_string(vinfo[vinfo_index].value, str+strlen(str)); strcat(str, ")"); From 7074a7c7ecd40a68786110fc7d3f6d6d83bda693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 19:44:51 +0200 Subject: [PATCH 093/136] reindex: fixes 64 bit warnings --- src/bin/reindex.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bin/reindex.cpp b/src/bin/reindex.cpp index 090fa74f4e..319e605fa3 100644 --- a/src/bin/reindex.cpp +++ b/src/bin/reindex.cpp @@ -247,7 +247,7 @@ handleFile(BEntry *entry, BNode *node) } // rewrite attrs and empty the list - while ((attr = static_cast(list.RemoveItem(0L))) != NULL) { + while ((attr = static_cast(list.RemoveItem((int32)0))) != NULL) { // write attribute back to file status = attr->WriteToFile(node); if (status != B_OK) { @@ -294,8 +294,8 @@ copyIndicesFromVolume(const char *path, BEntry &to) if (fs_create_index(targetDevice, index->d_name, indexInfo.type, 0) == -1 && errno != B_FILE_EXISTS && errno != B_BAD_VALUE) { - fprintf(stderr, "Could not create index '%s' (type = %lu): %s\n", - index->d_name, indexInfo.type, strerror(errno)); + fprintf(stderr, "Could not create index '%s' (type = %" B_PRIu32 + "): %s\n", index->d_name, indexInfo.type, strerror(errno)); } else gAttrList.AddItem(strdup(index->d_name)); } From 0059a07ade67dfac4d8de0cbdd11502958ee8faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 19:46:29 +0200 Subject: [PATCH 094/136] roster: fixes 64 bit warnings --- src/bin/roster.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/roster.cpp b/src/bin/roster.cpp index ae611b3e84..9eca23be26 100644 --- a/src/bin/roster.cpp +++ b/src/bin/roster.cpp @@ -79,7 +79,7 @@ output_team(team_id id, int32 mode) if ((mode & kNoTruncateMode) == 0) truncate_string(name, kNameFieldWidth); - printf("%6ld %*s %5ld %5lx (%s)\n", + printf("%6" B_PRId32 " %*s %5" B_PRId32 " %5" B_PRIx32 " (%s)\n", id, (int)kNameFieldWidth, name.String(), info.port, info.flags, info.signature); } @@ -141,7 +141,7 @@ main(int argc, char **argv) // Iterate through the list. for (int32 i = 0; i < applicationList.CountItems(); i++) - output_team((team_id)applicationList.ItemAt(i), mode); + output_team((team_id)(addr_t)applicationList.ItemAt(i), mode); return 0; } From bc8c7d615d95fbca5192912189c934510ee72a92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 19:49:36 +0200 Subject: [PATCH 095/136] translate: fixes 64 bit warnings --- src/bin/translate.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/bin/translate.cpp b/src/bin/translate.cpp index 27969917c8..48de3954ad 100644 --- a/src/bin/translate.cpp +++ b/src/bin/translate.cpp @@ -131,21 +131,21 @@ print_translation_format(const translation_format &format) void TypeList::Add(uint32 type) { - fList.AddItem((void *)type, 0); + fList.AddItem((void *)(addr_t)type, 0); } bool TypeList::Remove(uint32 type) { - return fList.RemoveItem((void *)type); + return fList.RemoveItem((void *)(addr_t)type); } bool TypeList::FindType(uint32 type) { - return fList.IndexOf((void *)type) >= 0; + return fList.IndexOf((void *)(addr_t)type) >= 0; } @@ -155,7 +155,7 @@ TypeList::SetTo(TypeList &types) fList.MakeEmpty(); for (int32 i = 0; i < types.Count(); i++) - fList.AddItem((void *)types.TypeAt(i)); + fList.AddItem((void *)(addr_t)types.TypeAt(i)); } @@ -169,7 +169,7 @@ TypeList::Count() uint32 TypeList::TypeAt(int32 index) { - return (uint32)fList.ItemAt(index); + return (uint32)(addr_t)fList.ItemAt(index); } @@ -612,7 +612,8 @@ TranslateApp::ListTranslators(uint32 type) continue; } - printf("name: %s\ninfo: %s\nversion: %ld.%ld.%ld\n", name, info, + printf("name: %s\ninfo: %s\nversion: %" B_PRId32 ".%" B_PRId32 ".%" + B_PRId32 "\n", name, info, B_TRANSLATION_MAJOR_VERSION(version), B_TRANSLATION_MINOR_VERSION(version), B_TRANSLATION_REVISION_VERSION(version)); From 006e76a155e8ab3b8fd008c7b290ef73f9a5d90b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 19:53:03 +0200 Subject: [PATCH 096/136] MidiPlayer: fixes 64 bit warnings --- src/apps/midiplayer/MidiPlayerWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/midiplayer/MidiPlayerWindow.cpp b/src/apps/midiplayer/MidiPlayerWindow.cpp index e098f584a0..95dbe958e9 100644 --- a/src/apps/midiplayer/MidiPlayerWindow.cpp +++ b/src/apps/midiplayer/MidiPlayerWindow.cpp @@ -394,7 +394,7 @@ void MidiPlayerWindow::StartSynth() { synth.Start(); - synth.SetFileHook(_StopHook, (int32) this); + synth.SetFileHook(_StopHook, (int32)(addr_t)this); playing = true; } @@ -412,7 +412,7 @@ MidiPlayerWindow::StopSynth() void MidiPlayerWindow::_StopHook(int32 arg) { - ((MidiPlayerWindow*)arg)->StopHook(); + ((MidiPlayerWindow*)(addr_t)arg)->StopHook(); } From 4c1efaad9c318c63e71653392fdb595f414696b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 19:56:07 +0200 Subject: [PATCH 097/136] MailPreferences: fixes 64 bit warnings --- src/preferences/mail/ConfigWindow.cpp | 6 +++--- src/preferences/mail/DNSQuery.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/preferences/mail/ConfigWindow.cpp b/src/preferences/mail/ConfigWindow.cpp index 8007d45bff..36d43126a9 100644 --- a/src/preferences/mail/ConfigWindow.cpp +++ b/src/preferences/mail/ConfigWindow.cpp @@ -815,15 +815,15 @@ ConfigWindow::_SetToGeneralSettings(BMailSettings *settings) int timeIndex = 0; if (interval >= 60) { timeIndex = 1; - sprintf(text, "%ld", interval / (60)); + sprintf(text, "%" B_PRIdTIME, interval / (60)); } if (interval >= (60*60)) { timeIndex = 2; - sprintf(text, "%ld", interval / (60*60)); + sprintf(text, "%" B_PRIdTIME, interval / (60*60)); } if (interval >= (60*60*24)) { timeIndex = 3; - sprintf(text, "%ld", interval / (60*60*24)); + sprintf(text, "%" B_PRIdTIME, interval / (60*60*24)); } fIntervalControl->SetText(text); diff --git a/src/preferences/mail/DNSQuery.cpp b/src/preferences/mail/DNSQuery.cpp index ee31cfd13e..4b638ea548 100644 --- a/src/preferences/mail/DNSQuery.cpp +++ b/src/preferences/mail/DNSQuery.cpp @@ -106,7 +106,7 @@ BRawNetBuffer::ReadString(BString& string) status_t BRawNetBuffer::SkipReading(off_t skip) { - if (fReadPosition + skip > fBuffer.BufferLength()) + if (fReadPosition + skip > (off_t)fBuffer.BufferLength()) return B_ERROR; fReadPosition += skip; return B_OK; @@ -125,7 +125,7 @@ BRawNetBuffer::_Init(const void* buf, size_t size) ssize_t BRawNetBuffer::_ReadStringAt(BString& string, off_t pos) { - if (pos >= fBuffer.BufferLength()) + if (pos >= (off_t)fBuffer.BufferLength()) return -1; ssize_t bytesRead = 0; @@ -133,7 +133,7 @@ BRawNetBuffer::_ReadStringAt(BString& string, off_t pos) buffer = &buffer[pos]; // if the string is compressed we have to follow the links to the // sub strings - while (pos < fBuffer.BufferLength() && *buffer != 0) { + while (pos < (off_t)fBuffer.BufferLength() && *buffer != 0) { if (uint8(*buffer) == 192) { // found a pointer mark buffer++; From 0bbc331f6b5a56c98243fcf9c1f2dadff4450b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 19:59:05 +0200 Subject: [PATCH 098/136] ShorcutsPreferences: fixes 64 bit warnings --- src/preferences/shortcuts/ShortcutsSpec.cpp | 2 +- src/preferences/shortcuts/ShortcutsWindow.cpp | 3 ++- src/preferences/shortcuts/clv/ColumnListView.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/preferences/shortcuts/ShortcutsSpec.cpp b/src/preferences/shortcuts/ShortcutsSpec.cpp index 2fbb513b2e..d7f5ca51bc 100644 --- a/src/preferences/shortcuts/ShortcutsSpec.cpp +++ b/src/preferences/shortcuts/ShortcutsSpec.cpp @@ -488,7 +488,7 @@ ShortcutsSpec::GetCellText(int whichColumn) const if (temp == NULL) temp = ""; } else if (fKey > 0xFF) { - sprintf(fScratch, "#%lx", fKey); + sprintf(fScratch, "#%" B_PRIx32, fKey); return fScratch; } break; diff --git a/src/preferences/shortcuts/ShortcutsWindow.cpp b/src/preferences/shortcuts/ShortcutsWindow.cpp index 5a5c6785e6..dd2803937c 100644 --- a/src/preferences/shortcuts/ShortcutsWindow.cpp +++ b/src/preferences/shortcuts/ShortcutsWindow.cpp @@ -569,7 +569,8 @@ ShortcutsWindow::MessageReceived(BMessage* msg) if (fLastOpenWasAppend == false) { // Clear the menu... while (ShortcutsSpec* item - = ((ShortcutsSpec*)fColumnListView->RemoveItem(0L))) { + = ((ShortcutsSpec*) + fColumnListView->RemoveItem((int32)0))) { delete item; } } diff --git a/src/preferences/shortcuts/clv/ColumnListView.cpp b/src/preferences/shortcuts/clv/ColumnListView.cpp index b9c78192fc..bc7f496ab9 100644 --- a/src/preferences/shortcuts/clv/ColumnListView.cpp +++ b/src/preferences/shortcuts/clv/ColumnListView.cpp @@ -1255,7 +1255,7 @@ bool ColumnListView::RemoveItems(int32 fullListIndex, int32 count) CLVListItem* TheItem; if(fHierarchical) { - uint32 LastSuperItemLevel = ULONG_MAX; + uint32 LastSuperItemLevel = UINT32_MAX; int32 Counter; int32 DisplayItemsToRemove = 0; int32 FirstDisplayItemToRemove = -1; From e971f3b162e3ef88ff204b3bf67e0635571a46a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 20:04:02 +0200 Subject: [PATCH 099/136] shortcut_catcher: fixes 64 bit warnings --- .../shortcut_catcher/CommandActuators.cpp | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/add-ons/input_server/filters/shortcut_catcher/CommandActuators.cpp b/src/add-ons/input_server/filters/shortcut_catcher/CommandActuators.cpp index 84d63c5c97..eae5dad29e 100644 --- a/src/add-ons/input_server/filters/shortcut_catcher/CommandActuators.cpp +++ b/src/add-ons/input_server/filters/shortcut_catcher/CommandActuators.cpp @@ -609,10 +609,10 @@ KeyStrokeSequenceCommandActuator::KeyStrokeSequenceCommandActuator(int32 argc, BString newStr = fSequence; newStr.Truncate(nextStart); - fOverrides.AddItem((void*)unicodeVal); - fOverrideOffsets.AddItem((void*)newStr.Length()); - fOverrideModifiers.AddItem((void*)customMods); - fOverrideKeyCodes.AddItem((void*)customKey); + fOverrides.AddItem((void*)(addr_t)unicodeVal); + fOverrideOffsets.AddItem((void*)(addr_t)newStr.Length()); + fOverrideModifiers.AddItem((void*)(addr_t)customMods); + fOverrideKeyCodes.AddItem((void*)(addr_t)customKey); newStr.Append(((unicodeVal > 0) && (unicodeVal < 127)) ? ((char)unicodeVal): ' ',1); newStr.Append(&fSequence.String()[nextEnd + 2]); @@ -636,22 +636,22 @@ KeyStrokeSequenceCommandActuator::KeyStrokeSequenceCommandActuator( int32 temp; for (int32 i = 0; from->FindInt32("ooffsets", i, &temp) == B_NO_ERROR; i++) { - fOverrideOffsets.AddItem((void*)temp); + fOverrideOffsets.AddItem((void*)(addr_t)temp); if (from->FindInt32("overrides", i, &temp) != B_NO_ERROR) temp = ' '; - fOverrides.AddItem((void*)temp); + fOverrides.AddItem((void*)(addr_t)temp); if (from->FindInt32("omods", i, &temp) != B_NO_ERROR) temp = -1; - fOverrideModifiers.AddItem((void*)temp); + fOverrideModifiers.AddItem((void*)(addr_t)temp); if (from->FindInt32("okeys", i, &temp) != B_NO_ERROR) temp = 0; - fOverrideKeyCodes.AddItem((void*)temp); + fOverrideKeyCodes.AddItem((void*)(addr_t)temp); } _GenerateKeyCodes(); } @@ -682,9 +682,9 @@ KeyStrokeSequenceCommandActuator::_GenerateKeyCodes() uint32 overrideKey= 0; uint32 overrideMods = (uint32)-1; for (int32 j = fOverrideOffsets.CountItems()-1; j >= 0; j--) { - if ((int32)fOverrideOffsets.ItemAt(j) == i) { - overrideKey= (uint32) fOverrideKeyCodes.ItemAt(j); - overrideMods = (uint32) fOverrideModifiers.ItemAt(j); + if ((int32)(addr_t)fOverrideOffsets.ItemAt(j) == i) { + overrideKey= (uint32)(addr_t) fOverrideKeyCodes.ItemAt(j); + overrideMods = (uint32)(addr_t) fOverrideModifiers.ItemAt(j); break; } } @@ -853,19 +853,23 @@ KeyStrokeSequenceCommandActuator::Archive(BMessage* into, bool deep) const int32 numOverrides = fOverrideOffsets.CountItems(); status_t tmp = B_OK; for (int32 i = 0; i < numOverrides; i++) { - ret = into->AddInt32("ooffsets", (int32)fOverrideOffsets.ItemAt(i)); + ret = into->AddInt32("ooffsets", + (int32)(addr_t)fOverrideOffsets.ItemAt(i)); if (ret != B_NO_ERROR) tmp = B_ERROR; - ret = into->AddInt32("overrides", (int32)fOverrides.ItemAt(i)); + ret = into->AddInt32("overrides", + (int32)(addr_t)fOverrides.ItemAt(i)); if (ret != B_NO_ERROR) tmp = B_ERROR; - ret = into->AddInt32("omods", (int32)fOverrideModifiers.ItemAt(i)); + ret = into->AddInt32("omods", + (int32)(addr_t)fOverrideModifiers.ItemAt(i)); if (ret != B_NO_ERROR) tmp = B_ERROR; - ret = into->AddInt32("okeys", (int32)fOverrideKeyCodes.ItemAt(i)); + ret = into->AddInt32("okeys", + (int32)(addr_t)fOverrideKeyCodes.ItemAt(i)); } if (tmp == B_ERROR) @@ -895,9 +899,9 @@ KeyStrokeSequenceCommandActuator::KeyEvent(const BMessage* keyMsg, int32 override = -1; for (int32 j = fOverrideOffsets.CountItems()-1; j >= 0; j--) { - int32 offset = (int32) fOverrideOffsets.ItemAt(j); + int32 offset = (int32)(addr_t) fOverrideOffsets.ItemAt(j); if (offset == i) { - override = (int32) fOverrides.ItemAt(j); + override = (int32)(addr_t) fOverrides.ItemAt(j); break; } } From 99f76d5df5d52be2e05edb944d10926d92eb6109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 20:08:02 +0200 Subject: [PATCH 100/136] Chart: fixes 64 bit warnings --- src/tests/kits/game/chart/ChartWindow.cpp | 6 +++--- src/tests/kits/game/chart/ChartWindow.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/kits/game/chart/ChartWindow.cpp b/src/tests/kits/game/chart/ChartWindow.cpp index aa182c2236..a3190711c8 100644 --- a/src/tests/kits/game/chart/ChartWindow.cpp +++ b/src/tests/kits/game/chart/ChartWindow.cpp @@ -1171,7 +1171,7 @@ ChartWindow::ButtonPicture(bool active, int32 button_type) than what a standard BButton would allow) with the current value of the star density pourcentage. */ value = (fCurrentSettings.star_density*100 + STAR_DENSITY_MAX/2) / STAR_DENSITY_MAX; - sprintf(word, "%3ld", value); + sprintf(word, "%3" B_PRId32, value); draw_string: fOffwindowButton->SetFont(be_bold_font); fOffwindowButton->SetFontSize(14.0); @@ -2135,7 +2135,7 @@ ChartWindow::SetPatternBits(buffer *buf) That's the main thread controling the animation and synchronising the engine state with the changes coming from the UI. */ -long +int32 ChartWindow::Animation(void *data) { int32 i, cur_4_frames_index, cur_last_fps, count_fps; @@ -2253,7 +2253,7 @@ ChartWindow::Animation(void *data) slave of the Animation thread. It's directly synchronised with its master, and will only do some star animation processing whenever its master allows him to do so. */ -long +int32 ChartWindow::Animation2(void *data) { ChartWindow *w = (ChartWindow*)data; diff --git a/src/tests/kits/game/chart/ChartWindow.h b/src/tests/kits/game/chart/ChartWindow.h index 51a430a477..659c51735b 100644 --- a/src/tests/kits/game/chart/ChartWindow.h +++ b/src/tests/kits/game/chart/ChartWindow.h @@ -292,8 +292,8 @@ static BWindow *GetAppWindow(const char *name); /* Engine processing related functions. */ /* those functions are the two processing threads launcher */ -static long Animation(void *data); -static long Animation2(void *data); +static int32 Animation(void *data); +static int32 Animation2(void *data); /* After every camera move or rotation, reprocess the torus cycle of the starfield to maintain the pyramid of vision of the camera completly inside a 1x1x1 iteration of the From 981062893ed163e450915d370264ee175e097531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 20:09:22 +0200 Subject: [PATCH 101/136] Clock: fixes 64 bit warnings --- src/apps/clock/cl_view.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/clock/cl_view.cpp b/src/apps/clock/cl_view.cpp index d0605d95e4..d6cfb8e6a8 100644 --- a/src/apps/clock/cl_view.cpp +++ b/src/apps/clock/cl_view.cpp @@ -333,7 +333,7 @@ void TOnscreenView::MouseDown( BPoint point ) { BPoint cursor; - ulong buttons; + uint32 buttons; BRect bounds = Bounds(); GetMouse(&cursor,&buttons); From 07eea198eae39dfa683f2907a58b8e9c8fc93fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 20:11:23 +0200 Subject: [PATCH 102/136] mandelbrot: fixes 64 bit warnings --- src/apps/mandelbrot/tsb.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/mandelbrot/tsb.cpp b/src/apps/mandelbrot/tsb.cpp index c77b9a8f93..f62daf14e8 100644 --- a/src/apps/mandelbrot/tsb.cpp +++ b/src/apps/mandelbrot/tsb.cpp @@ -243,7 +243,7 @@ char t2_done; /*------------------------------------------------------------*/ -long __calc1(void *arg) +int32 __calc1(void *arg) { tsbb->manda(vvx, vvy, ssx, ssx); return B_NO_ERROR; @@ -251,7 +251,7 @@ long __calc1(void *arg) /*------------------------------------------------------------*/ -long __calc2(void *arg) +int32 __calc2(void *arg) { tsbb->mandb(vvx, vvy, ssx, ssx); return B_NO_ERROR; @@ -526,7 +526,7 @@ char TShowBit::has_selection() void TShowBit::change_selection(long h, long v) { - ulong buttons; + uint32 buttons; long h0; long v0; BRect new_select; From 653d5b980c6314e416c2b2ccbbe0cced1498e7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 20:28:37 +0200 Subject: [PATCH 103/136] pop3: fixes 64 bit warnings --- .../inbound_protocols/pop3/MessageIO.cpp | 2 +- .../mail_daemon/inbound_protocols/pop3/pop3.cpp | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/add-ons/mail_daemon/inbound_protocols/pop3/MessageIO.cpp b/src/add-ons/mail_daemon/inbound_protocols/pop3/MessageIO.cpp index 58913947ab..a49a77108b 100644 --- a/src/add-ons/mail_daemon/inbound_protocols/pop3/MessageIO.cpp +++ b/src/add-ons/mail_daemon/inbound_protocols/pop3/MessageIO.cpp @@ -102,7 +102,7 @@ BMailMessageIO::ReadAt(off_t pos, void* buffer, size_t amountToRead) // Put the file position back at where it was, if possible. That's because // ReadAt isn't supposed to affect the file position. - if (oldPosition < fSize) + if (oldPosition < (off_t)fSize) fSlave->Seek (oldPosition, SEEK_SET); else fSlave->Seek (0, SEEK_END); diff --git a/src/add-ons/mail_daemon/inbound_protocols/pop3/pop3.cpp b/src/add-ons/mail_daemon/inbound_protocols/pop3/pop3.cpp index 25a391d6ed..078b45ebe9 100644 --- a/src/add-ons/mail_daemon/inbound_protocols/pop3/pop3.cpp +++ b/src/add-ons/mail_daemon/inbound_protocols/pop3/pop3.cpp @@ -494,8 +494,9 @@ POP3Protocol::Stat() if (SendCommand("STAT" CRLF) < B_OK) return B_ERROR; - int32 messages,dropSize; - if (sscanf(fLog.String(), "+OK %ld %ld", &messages, &dropSize) < 2) + int32 messages, dropSize; + if (sscanf(fLog.String(), "+OK %" B_SCNd32" %" B_SCNd32, &messages, + &dropSize) < 2) return B_ERROR; fNumMessages = messages; @@ -591,11 +592,11 @@ POP3Protocol::Retrieve(int32 message, BPositionIO *write_to) int32 message_len = MessageSize(message); write_to->Seek (0, SEEK_END); if (write_to->Position() != message_len) { - printf ("POP3Protocol::Retrieve Note: message size is %d, was " - "expecting %ld, for message #%ld. Could be a transmission error " - "or a bad POP server implementation (does it remove escape codes " - "when it counts size?).\n", - (int) write_to->Position(), message_len, message); + printf ("POP3Protocol::Retrieve Note: message size is %" B_PRIdOFF + ", was expecting %" B_PRId32 ", for message #%" B_PRId32 ". " + "Could be a transmission error or a bad POP server " + "implementation (does it remove escape codes when it counts " + "size?).\n", write_to->Position(), message_len, message); } } @@ -916,7 +917,7 @@ POP3Protocol::_UniqueIDs() b = atol(&(result.String()[b])); else b = 0; - fSizes.AddItem((void *)(b)); + fSizes.AddItem((void *)(addr_t)b); } return ret; From a8dca855578ec8795e81ccc2a79d4ca5e03a57d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 20:32:29 +0200 Subject: [PATCH 104/136] imap: fixes 64 bit warnings --- .../inbound_protocols/imap/imap_lib/IMAPProtocol.cpp | 4 ++-- .../inbound_protocols/imap/imap_lib/IMAPStorage.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPProtocol.cpp b/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPProtocol.cpp index 6f33929002..8297b9de54 100644 --- a/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPProtocol.cpp +++ b/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPProtocol.cpp @@ -297,7 +297,7 @@ IMAPProtocol::SendCommand(const char* command, int32 commandID) return B_NO_MEMORY; static char cmd[256]; - ::sprintf(cmd, "A%.7ld %s"CRLF, commandID, command); + ::sprintf(cmd, "A%.7" B_PRId32 " %s"CRLF, commandID, command); TRACE("_SendCommand: %s\n", cmd); int commandLength = strlen(cmd); @@ -347,7 +347,7 @@ IMAPProtocol::HandleResponse(int32 commandID, bigtime_t timeout, for (std::vector::iterator it = fOngoingCommands.begin(); it != fOngoingCommands.end(); it++) { static char idString[8]; - ::sprintf(idString, "A%.7ld", *it); + ::sprintf(idString, "A%.7" B_PRId32, *it); if (line.FindFirst(idString) >= 0) { if (*it == commandID) { BString result = IMAPParser::ExtractElementAfter(line, diff --git a/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.cpp b/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.cpp index 17c6f043de..762fad56f3 100644 --- a/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.cpp +++ b/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/IMAPStorage.cpp @@ -240,7 +240,7 @@ IMAPStorage::DeleteMessage(int32 uid) BPath filePath = fMailboxPath; filePath.Append(storageEntry.fileName); BEntry entry(filePath.Path()); - TRACE("IMAPStorage::DeleteMessage %s, %ld\n", filePath.Path(), uid); + TRACE("IMAPStorage::DeleteMessage %s, %" B_PRId32 "\n", filePath.Path(), uid); status_t status = entry.Remove(); if (status != B_OK) From 5f3e33091c9ab4e101bb6a11157d8d5624ca0839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 20:55:34 +0200 Subject: [PATCH 105/136] match_header and spam_filter: fixes 64 bit warnings --- .../mail_daemon/inbound_filters/match_header/ConfigView.cpp | 2 +- .../mail_daemon/inbound_filters/match_header/RuleFilter.cpp | 2 +- .../inbound_filters/spam_filter/SpamFilterConfig.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/add-ons/mail_daemon/inbound_filters/match_header/ConfigView.cpp b/src/add-ons/mail_daemon/inbound_filters/match_header/ConfigView.cpp index 03e8487ebf..38936ec26a 100644 --- a/src/add-ons/mail_daemon/inbound_filters/match_header/ConfigView.cpp +++ b/src/add-ons/mail_daemon/inbound_filters/match_header/ConfigView.cpp @@ -85,7 +85,7 @@ RuleFilterConfig::RuleFilterConfig(const BMessage *settings) chain = settings->FindInt32("argument"); else chain = -1; - printf("Chain: %ld\n",chain); + printf("Chain: %" B_PRId32 "\n",chain); BMailAccounts accounts; for (int32 i = 0; i < accounts.CountAccounts(); i++) { diff --git a/src/add-ons/mail_daemon/inbound_filters/match_header/RuleFilter.cpp b/src/add-ons/mail_daemon/inbound_filters/match_header/RuleFilter.cpp index 512a00247c..ed3bf8a74b 100644 --- a/src/add-ons/mail_daemon/inbound_filters/match_header/RuleFilter.cpp +++ b/src/add-ons/mail_daemon/inbound_filters/match_header/RuleFilter.cpp @@ -43,7 +43,7 @@ RuleFilter::RuleFilter(MailProtocol& protocol, AddonSettings* addonSettings) fMatcher.SetPattern(regex, false); settings->FindString("argument",&fArg); - settings->FindInt32("do_what",(long *)&fDoWhat); + settings->FindInt32("do_what", (int32*)&fDoWhat); if (fDoWhat == Z_SET_REPLY) settings->FindInt32("argument", &fReplyAccount); } diff --git a/src/add-ons/mail_daemon/inbound_filters/spam_filter/SpamFilterConfig.cpp b/src/add-ons/mail_daemon/inbound_filters/spam_filter/SpamFilterConfig.cpp index bc71405e1d..2d0820ba48 100644 --- a/src/add-ons/mail_daemon/inbound_filters/spam_filter/SpamFilterConfig.cpp +++ b/src/add-ons/mail_daemon/inbound_filters/spam_filter/SpamFilterConfig.cpp @@ -414,7 +414,7 @@ AGMSBayesianSpamFilterConfig::ShowSpamServerConfigurationWindow () { maximizeCommand.what = B_SET_PROPERTY; maximizeCommand.AddBool ("data", false); maximizeCommand.AddSpecifier ("Minimize"); - maximizeCommand.AddSpecifier ("Window", 0L); + maximizeCommand.AddSpecifier ("Window", (int32)0); errorCode = messengerToServer.SendMessage (&maximizeCommand, &replyMessage); if (errorCode != B_OK) goto ErrorExit; From e1a77daa6943536838624efddaeabc41142ed28c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 20:59:13 +0200 Subject: [PATCH 106/136] Cortex: fixes 64 bit warnings --- src/apps/cortex/addons/common/AudioBuffer.cpp | 6 +++--- src/apps/cortex/addons/common/MediaNodeControlApp.cpp | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/apps/cortex/addons/common/AudioBuffer.cpp b/src/apps/cortex/addons/common/AudioBuffer.cpp index f09212714b..92ceffb4f9 100644 --- a/src/apps/cortex/addons/common/AudioBuffer.cpp +++ b/src/apps/cortex/addons/common/AudioBuffer.cpp @@ -295,7 +295,7 @@ uint32 AudioBuffer::findMin(uint32 fromFrame, uint32 frameCount, if(pAt) { // reset pAt for(n = 0; n < channels; n++) - pAt[n] = ULONG_MAX; + pAt[n] = UINT32_MAX; } // find minimum for each channel @@ -348,7 +348,7 @@ uint32 AudioBuffer::findMax(uint32 fromFrame, uint32 frameCount, if(pAt) { // reset pAt for(n = 0; n < channels; n++) - pAt[n] = ULONG_MAX; + pAt[n] = UINT32_MAX; } // find minimum for each channel @@ -400,7 +400,7 @@ uint32 AudioBuffer::findPeaks(uint32 fromFrame, uint32 frameCount, if(pAt) { // reset pAt for(n = 0; n < channels; n++) - pAt[n] = ULONG_MAX; + pAt[n] = UINT32_MAX; } // find peaks in both directions diff --git a/src/apps/cortex/addons/common/MediaNodeControlApp.cpp b/src/apps/cortex/addons/common/MediaNodeControlApp.cpp index d0326ebbfb..4e6bd81323 100644 --- a/src/apps/cortex/addons/common/MediaNodeControlApp.cpp +++ b/src/apps/cortex/addons/common/MediaNodeControlApp.cpp @@ -82,7 +82,7 @@ MediaNodeControlApp::MediaNodeControlApp( if(err < B_OK) { char buffer[512]; sprintf(buffer, - "MediaNodeControlApp: couldn't find node (%ld):\n%s\n", + "MediaNodeControlApp: couldn't find node (%" B_PRId32 "):\n%s\n", nodeID, strerror(err)); BAlert* alert = new BAlert("error", buffer, "OK"); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); @@ -96,8 +96,8 @@ MediaNodeControlApp::MediaNodeControlApp( if(err < B_OK) { char buffer[512]; sprintf(buffer, - "MediaNodeControlApp: couldn't get node info (%ld):\n%s\n", - nodeID, strerror(err)); + "MediaNodeControlApp: couldn't get node info (%" B_PRId32 + "):\n%s\n", nodeID, strerror(err)); BAlert* alert = new BAlert("error", buffer, "OK"); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); @@ -113,8 +113,8 @@ MediaNodeControlApp::MediaNodeControlApp( if(err < B_OK) { char buffer[512]; sprintf(buffer, - "MediaNodeControlApp: no parameters for node (%ld):\n%s\n", - nodeID, strerror(err)); + "MediaNodeControlApp: no parameters for node (%" B_PRId32 + "):\n%s\n", nodeID, strerror(err)); BAlert* alert = new BAlert("error", buffer, "OK"); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); From 217c8a17a8777e119c2b389c493a8d8218d65679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 21:03:20 +0200 Subject: [PATCH 107/136] multi_audio.media_addon: fixes 64 bit warnings --- .../media-add-ons/multi_audio/MultiAudioNode.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.cpp b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.cpp index ffac270c82..ddac66162e 100644 --- a/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.cpp +++ b/src/add-ons/media/media-add-ons/multi_audio/MultiAudioNode.cpp @@ -364,7 +364,7 @@ MultiAudioNode::NodeRegistered() input->destination.port = ControlPort(); input->destination.id = fInputs.CountItems(); input->node = Node(); - sprintf(input->name, "output %ld", input->destination.id); + sprintf(input->name, "output %" B_PRId32, input->destination.id); currentInput = new node_input(*input, fOutputPreferredFormat); currentInput->fPreferredFormat.u.raw_audio.channel_count = 1; @@ -414,7 +414,7 @@ MultiAudioNode::NodeRegistered() output->source.port = ControlPort(); output->source.id = fOutputs.CountItems(); output->node = Node(); - sprintf(output->name, "input %ld", output->source.id); + sprintf(output->name, "input %" B_PRId32, output->source.id); currentOutput = new node_output(*output, fInputPreferredFormat); currentOutput->fPreferredFormat.u.raw_audio.channel_count = 1; @@ -1014,8 +1014,10 @@ MultiAudioNode::Disconnect(const media_source& what, delete channel->fBufferGroup; channel->fBufferGroup = NULL; } else { - fprintf(stderr, "\tDisconnect() called with wrong source/destination (%ld/%ld), ours is (%ld/%ld)\n", - what.id, where.id, channel->fOutput.source.id, channel->fOutput.destination.id); + fprintf(stderr, "\tDisconnect() called with wrong source/destination (" + "%" B_PRId32 "/%" B_PRId32 "), ours is (%" B_PRId32 "/%" B_PRId32 + ")\n", what.id, where.id, channel->fOutput.source.id, + channel->fOutput.destination.id); } } @@ -1047,7 +1049,7 @@ MultiAudioNode::LateNoticeReceived(const media_source& what, bigtime_t howMuch, fInternalLatency += howMuch; SetEventLatency(fLatency + fInternalLatency); - fprintf(stderr, "\tincreasing latency to %Ld\n", + fprintf(stderr, "\tincreasing latency to %" B_PRIdBIGTIME"\n", fLatency + fInternalLatency); } else { // The other run modes dictate various strategies for sacrificing data @@ -1122,7 +1124,7 @@ MultiAudioNode::HandleEvent(const media_timed_event* event, bigtime_t lateness, _HandleParameter(event, lateness, realTimeEvent); break; default: - fprintf(stderr," unknown event type: %li\n", event->type); + fprintf(stderr," unknown event type: %" B_PRId32 "\n", event->type); break; } } @@ -1158,7 +1160,7 @@ MultiAudioNode::_HandleBuffer(const media_timed_event* event, // lateness doesn't matter in offline mode or in recording mode //mLateBuffers++; NotifyLateProducer(channel->fInput.source, -howEarly, performanceTime); - fprintf(stderr," <- LATE BUFFER : %lli\n", howEarly); + fprintf(stderr," <- LATE BUFFER : %" B_PRIdBIGTIME "\n", howEarly); buffer->Recycle(); } else { //WriteBuffer(buffer, *channel); From 973f12146b02030523dca4771408d1a0e8cf31ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 21:11:34 +0200 Subject: [PATCH 108/136] mixer.media_addon: fixes 64 bit warnings --- .../media/media-add-ons/mixer/AudioMixer.cpp | 31 ++++++++++++------- .../media/media-add-ons/mixer/MixerCore.cpp | 2 +- .../media/media-add-ons/mixer/MixerInput.cpp | 16 ++++++---- .../media/media-add-ons/mixer/MixerUtils.cpp | 2 +- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/add-ons/media/media-add-ons/mixer/AudioMixer.cpp b/src/add-ons/media/media-add-ons/mixer/AudioMixer.cpp index b138573f55..5bcc8208aa 100644 --- a/src/add-ons/media/media-add-ons/mixer/AudioMixer.cpp +++ b/src/add-ons/media/media-add-ons/mixer/AudioMixer.cpp @@ -321,7 +321,8 @@ void AudioMixer::HandleInputBuffer(BBuffer* buffer, bigtime_t lateness) { if (lateness > kMaxJitter && lateness > fLastLateness) { - debug_printf("AudioMixer: Dequeued input buffer %Ld usec late\n", lateness); + debug_printf("AudioMixer: Dequeued input buffer %" B_PRIdBIGTIME + " usec late\n", lateness); if (RunMode() == B_DROP_DATA || RunMode() == B_DECREASE_PRECISION || RunMode() == B_INCREASE_LATENCY) { debug_printf("AudioMixer: sending notify\n"); @@ -380,8 +381,8 @@ AudioMixer::GetLatencyFor(const media_destination &for_whom, *out_latency = EventLatency(); *out_timesource = TimeSource()->ID(); - printf("AudioMixer::GetLatencyFor %Ld, timesource is %ld\n", - *out_latency, *out_timesource); + printf("AudioMixer::GetLatencyFor %" B_PRIdBIGTIME ", timesource is %" + B_PRId32 "\n", *out_latency, *out_timesource); return B_OK; } @@ -398,8 +399,8 @@ AudioMixer::Connected(const media_source &producer, // BBufferProducer::PrepareToConnect() should have removed all wildcards. if (out_input->format.u.raw_audio.frame_rate == 0) { fprintf(stderr, "Audio Mixer Warning: " - "Producer (port %ld, id %ld) connected with frame_rate=0\n", - producer.port, producer.id); + "Producer (port %" B_PRId32 ", id %" B_PRId32 ") connected with " + "frame_rate=0\n", producer.port, producer.id); MixerOutput *output = fCore->Output(); float frame_rate = output ? output->MediaOutput().format.u.raw_audio.frame_rate : 44100.0f; @@ -422,8 +423,10 @@ AudioMixer::Connected(const media_source &producer, // name, the name given the connection by the producer may still be an // empty string. // if the input has no name, assign one - if (strlen(out_input->name) == 0) - sprintf(out_input->name, "Input %ld", out_input->destination.id); + if (strlen(out_input->name) == 0) { + sprintf(out_input->name, "Input %" B_PRId32, + out_input->destination.id); + } // add a new input to the mixer engine MixerInput *input; @@ -607,16 +610,19 @@ AudioMixer::FormatChangeRequested(const media_source &source, media_node_id id; FindLatencyFor(destination, &fDownstreamLatency, &id); - TRACE("AudioMixer: Downstream Latency is %Ld usecs\n", fDownstreamLatency); + TRACE("AudioMixer: Downstream Latency is %" B_PRIdBIGTIME " usecs\n", + fDownstreamLatency); // SetDuration of one buffer SetBufferDuration(buffer_duration(io_format->u.raw_audio)); - TRACE("AudioMixer: buffer duration is %Ld usecs\n", BufferDuration()); + TRACE("AudioMixer: buffer duration is %" B_PRIdBIGTIME " usecs\n", + BufferDuration()); // Our internal latency is at least the length of a full output buffer fInternalLatency = BufferDuration() - + max(4500LL, bigtime_t(0.5 * BufferDuration())); - TRACE("AudioMixer: Internal latency is %Ld usecs\n", fInternalLatency); + + max((bigtime_t)4500, bigtime_t(0.5 * BufferDuration())); + TRACE("AudioMixer: Internal latency is %" B_PRIdBIGTIME " usecs\n", + fInternalLatency); SetEventLatency(fDownstreamLatency + fInternalLatency); @@ -1020,7 +1026,8 @@ AudioMixer::LateNoticeReceived(const media_source& what, bigtime_t howMuch, fLastLateNotification = TimeSource()->Now() + howMuch; - debug_printf("AudioMixer: increasing internal latency to %Ld usec\n", fInternalLatency); + debug_printf("AudioMixer: increasing internal latency to %" + B_PRIdBIGTIME " usec\n", fInternalLatency); SetEventLatency(fDownstreamLatency + fInternalLatency); PublishEventLatencyChange(); diff --git a/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp b/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp index 3ff2a8fecc..4931f4560d 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp +++ b/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp @@ -492,7 +492,7 @@ MixerCore::_MixThread() if (!LockFromMixThread()) return; - bigtime_t latency = max(3600LL, bigtime_t(0.4 * buffer_duration( + bigtime_t latency = max((bigtime_t)3600, bigtime_t(0.4 * buffer_duration( fOutput->MediaOutput().format.u.raw_audio))); // TODO: when the format changes while running, everything is wrong! diff --git a/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp b/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp index 5bb5085f61..420a2d728b 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp +++ b/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp @@ -183,22 +183,24 @@ MixerInput::BufferReceived(BBuffer* buffer) offset = expected_frame; } else { printf("MixerInput::BufferReceived: GLITCH! last frame was " - "%4ld, expected frame was %4d, new frame is %4d\n", - fLastDataFrameWritten, expected_frame, offset); + "%4" B_PRId32 ", expected frame was %4d, new frame is %4d" + "\n", fLastDataFrameWritten, expected_frame, offset); if (start > fLastDataAvailableTime) { if ((start - fLastDataAvailableTime) < (buffer_duration / 10)) { // buffer is less than 10% of buffer duration too late printf("short glitch, buffer too late, time delta " - "%Ld\n", start - fLastDataAvailableTime); + "%" B_PRIdBIGTIME "\n", start + - fLastDataAvailableTime); offset = expected_frame; out_frames++; } else { // buffer more than 10% of buffer duration too late // TODO: zerofill buffer printf("MAJOR glitch, buffer too late, time delta " - "%Ld\n", start - fLastDataAvailableTime); + "%" B_PRIdBIGTIME "\n", start + - fLastDataAvailableTime); } } else { // start <= fLastDataAvailableTime // the new buffer is too early @@ -206,7 +208,8 @@ MixerInput::BufferReceived(BBuffer* buffer) < (buffer_duration / 10)) { // buffer is less than 10% of buffer duration too early printf("short glitch, buffer too early, time delta " - "%Ld\n", fLastDataAvailableTime - start); + "%" B_PRIdBIGTIME "\n", fLastDataAvailableTime + - start); offset = expected_frame; out_frames--; if (out_frames < 1) @@ -215,7 +218,8 @@ MixerInput::BufferReceived(BBuffer* buffer) // buffer more than 10% of buffer duration too early // TODO: zerofill buffer printf("MAJOR glitch, buffer too early, time delta " - "%Ld\n", fLastDataAvailableTime - start); + "%" B_PRIdBIGTIME "\n", fLastDataAvailableTime + - start); } } } diff --git a/src/add-ons/media/media-add-ons/mixer/MixerUtils.cpp b/src/add-ons/media/media-add-ons/mixer/MixerUtils.cpp index ce28d01de6..a050bea7eb 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerUtils.cpp +++ b/src/add-ons/media/media-add-ons/mixer/MixerUtils.cpp @@ -53,7 +53,7 @@ StringForChannelMask(char *str, uint32 mask) DECODE(B_CHANNEL_MONO, "Mono"); #undef DECODE if (mask) - sprintf(str + strlen(str), "0x%08lX", mask); + sprintf(str + strlen(str), "0x%08" B_PRIx32, mask); return str; } From c7000dc3eeeeb54e7bff219134166367290ca600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 21:19:06 +0200 Subject: [PATCH 109/136] opensound.media_addon: fixes 64 bit warnings --- .../opensound/OpenSoundDevice.cpp | 4 +-- .../opensound/OpenSoundDeviceEngine.cpp | 12 ++++++--- .../media-add-ons/opensound/OpenSoundNode.cpp | 26 ++++++++++--------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/add-ons/media/media-add-ons/opensound/OpenSoundDevice.cpp b/src/add-ons/media/media-add-ons/opensound/OpenSoundDevice.cpp index df9fd14f2d..427d3020fc 100644 --- a/src/add-ons/media/media-add-ons/opensound/OpenSoundDevice.cpp +++ b/src/add-ons/media/media-add-ons/opensound/OpenSoundDevice.cpp @@ -364,8 +364,8 @@ status_t OpenSoundDevice::InitDriver() { CALLED(); - PRINT(("OpenSoundDevice::InitDriver: %ld engines, %ld mixers\n", - CountEngines(), CountMixers())); + PRINT(("OpenSoundDevice::InitDriver: %" B_PRId32 " engines, %" B_PRId32 + " mixers\n", CountEngines(), CountMixers())); if (CountMixers()) { ;//... diff --git a/src/add-ons/media/media-add-ons/opensound/OpenSoundDeviceEngine.cpp b/src/add-ons/media/media-add-ons/opensound/OpenSoundDeviceEngine.cpp index 4e26d27f8d..cf74f4629d 100644 --- a/src/add-ons/media/media-add-ons/opensound/OpenSoundDeviceEngine.cpp +++ b/src/add-ons/media/media-add-ons/opensound/OpenSoundDeviceEngine.cpp @@ -540,7 +540,8 @@ status_t OpenSoundDeviceEngine::AcceptFormatFor(int fmt, media_format &format, b return err; } - PRINT(("%s:step1 fmt=0x%08x, raw.format=0x%08lx\n", __FUNCTION__, fmt, raw.format)); + PRINT(("%s:step1 fmt=0x%08x, raw.format=0x%08" B_PRIx32 "\n", + __FUNCTION__, fmt, raw.format)); // if specified, try it if (raw.format) afmt = OpenSoundDevice::convert_media_format_to_oss_format(raw.format); @@ -556,7 +557,8 @@ status_t OpenSoundDeviceEngine::AcceptFormatFor(int fmt, media_format &format, b PRINT(("%s:step3 afmt=0x%08x\n", __FUNCTION__, afmt)); // convert back raw.format = OpenSoundDevice::convert_oss_format_to_media_format(afmt); - PRINT(("%s:step4 afmt=0x%08x, raw.format=0x%08lx\n", __FUNCTION__, afmt, raw.format)); + PRINT(("%s:step4 afmt=0x%08x, raw.format=0x%08" B_PRIx32 "\n", + __FUNCTION__, afmt, raw.format)); raw.valid_bits = OpenSoundDevice::convert_oss_format_to_valid_bits(afmt); err = SetFormat(afmt); @@ -634,7 +636,8 @@ status_t OpenSoundDeviceEngine::SpecializeFormatFor(int fmt, media_format &forma if (format.type == B_MEDIA_RAW_AUDIO) { media_multi_audio_format &raw = format.u.raw_audio; - PRINT(("%s:step1 fmt=0x%08x, raw.format=0x%08lx\n", __FUNCTION__, fmt, raw.format)); + PRINT(("%s:step1 fmt=0x%08x, raw.format=0x%08" B_PRIx32 "\n", + __FUNCTION__, fmt, raw.format)); // select the best as default if (!raw.format) { afmt = OpenSoundDevice::select_oss_format(fmt); @@ -651,7 +654,8 @@ status_t OpenSoundDeviceEngine::SpecializeFormatFor(int fmt, media_format &forma } // convert back raw.format = OpenSoundDevice::convert_oss_format_to_media_format(afmt); - PRINT(("%s:step4 afmt=0x%08x, raw.format=0x%08lx\n", __FUNCTION__, afmt, raw.format)); + PRINT(("%s:step4 afmt=0x%08x, raw.format=0x%08" B_PRIx32 "\n", + __FUNCTION__, afmt, raw.format)); if (!raw.valid_bits) raw.valid_bits = OpenSoundDevice::convert_oss_format_to_valid_bits(afmt); if (raw.valid_bits != OpenSoundDevice::convert_oss_format_to_valid_bits(afmt)) { diff --git a/src/add-ons/media/media-add-ons/opensound/OpenSoundNode.cpp b/src/add-ons/media/media-add-ons/opensound/OpenSoundNode.cpp index 39d747df76..8658b8b652 100644 --- a/src/add-ons/media/media-add-ons/opensound/OpenSoundNode.cpp +++ b/src/add-ons/media/media-add-ons/opensound/OpenSoundNode.cpp @@ -158,7 +158,7 @@ public: // make sure all buffers are recycled, or we might hang // when told to quit - while (BBuffer* buffer = (BBuffer*)fBuffers.RemoveItem(0L)) + while (BBuffer* buffer = (BBuffer*)fBuffers.RemoveItem((int32)0)) buffer->Recycle(); } @@ -325,7 +325,7 @@ OpenSoundNode::OpenSoundNode(BMediaAddOn* addon, const char* name, fTimeSourceStartTime(0), fWeb(NULL), - fConfig(0UL) + fConfig((uint32)0) { CALLED(); @@ -488,7 +488,7 @@ OpenSoundNode::NodeRegistered() const char *prefix = ""; if (strstr(engine->Info()->name, "SPDIF")) prefix = "S/PDIF "; - sprintf(mediaInput.name, "%sOutput %ld (%s)", prefix, + sprintf(mediaInput.name, "%sOutput %" B_PRId32 " (%s)", prefix, mediaInput.destination.id, gSupportedFormatsNames[f]); NodeInput* input = new (nothrow) NodeInput(mediaInput, i, fmt, @@ -536,7 +536,7 @@ OpenSoundNode::NodeRegistered() const char *prefix = ""; if (strstr(engine->Info()->name, "SPDIF")) prefix = "S/PDIF "; - sprintf(mediaOutput.name, "%sInput %ld (%s)", prefix, + sprintf(mediaOutput.name, "%sInput %" B_PRId32 " (%s)", prefix, mediaOutput.source.id, gSupportedFormatsNames[f]); NodeOutput* output = new (nothrow) NodeOutput(mediaOutput, @@ -1282,8 +1282,9 @@ OpenSoundNode::Disconnect(const media_source& what, channel->FreeBuffers(); } else { fprintf(stderr, "\tDisconnect() called with wrong source/destination " - "(%ld/%ld), ours is (%ld/%ld)\n", what.id, where.id, - channel->fOutput.source.id, channel->fOutput.destination.id); + "(%" B_PRId32 "/%" B_PRId32 "), ours is (%" B_PRId32 "/%" B_PRId32 + ")\n", what.id, where.id, channel->fOutput.source.id, + channel->fOutput.destination.id); } } @@ -1315,7 +1316,7 @@ OpenSoundNode::LateNoticeReceived(const media_source& what, bigtime_t how_much, fInternalLatency += how_much; SetEventLatency(fLatency + fInternalLatency); - fprintf(stderr, "\tincreasing latency to %Ld\n", + fprintf(stderr, "\tincreasing latency to %" B_PRIdBIGTIME "\n", fLatency + fInternalLatency); } else { // The other run modes dictate various strategies for sacrificing data @@ -1396,7 +1397,8 @@ OpenSoundNode::HandleEvent(const media_timed_event* event, bigtime_t lateness, HandleParameter(event,lateness,realTimeEvent); break; default: - fprintf(stderr," unknown event type: %li\n",event->type); + fprintf(stderr," unknown event type: %" B_PRId32 "\n", + event->type); break; } } @@ -1448,7 +1450,7 @@ OpenSoundNode::HandleBuffer(const media_timed_event* event, // TODO: Debug //mLateBuffers++; NotifyLateProducer(channel->fInput.source, -how_early, perf_time); - fprintf(stderr," <- LATE BUFFER : %lli\n", how_early); + fprintf(stderr," <- LATE BUFFER : %" B_PRIdBIGTIME "\n", how_early); buffer->Recycle(); } else { fDevice->Locker()->Lock(); @@ -1610,8 +1612,8 @@ OpenSoundNode::TimeSourceOp(const time_source_op_info& op, void* _reserved) break; case B_TIMESOURCE_SEEK: // TRACE("TimeSourceOp op B_TIMESOURCE_SEEK\n"); -printf("TimeSourceOp op B_TIMESOURCE_SEEK, real %lld, " - "perf %lld\n", op.real_time, op.performance_time); +printf("TimeSourceOp op B_TIMESOURCE_SEEK, real %" B_PRIdBIGTIME ", " + "perf %" B_PRIdBIGTIME "\n", op.real_time, op.performance_time); BroadcastTimeWarp(op.real_time, op.performance_time); break; default: @@ -2257,7 +2259,7 @@ OpenSoundNode::_PlayThread(NodeInput* input) TRACE("OpenSoundNode::_PlayThread: buffers: %ld\n", input->fBuffers.CountItems()); - BBuffer* buffer = (BBuffer*)input->fBuffers.RemoveItem(0L); + BBuffer* buffer = (BBuffer*)input->fBuffers.RemoveItem((int32)0); fDevice->Locker()->Unlock(); From e393a1691b8cf35adf8422f0e9c47e002a777a4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 21:19:58 +0200 Subject: [PATCH 110/136] tone_producer_demo: fixes 64 bit warnings --- .../media/media-add-ons/tone_producer_demo/ToneProducer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/add-ons/media/media-add-ons/tone_producer_demo/ToneProducer.cpp b/src/add-ons/media/media-add-ons/tone_producer_demo/ToneProducer.cpp index 7967feced9..e10172ee35 100644 --- a/src/add-ons/media/media-add-ons/tone_producer_demo/ToneProducer.cpp +++ b/src/add-ons/media/media-add-ons/tone_producer_demo/ToneProducer.cpp @@ -662,7 +662,8 @@ ToneProducer::Stop(bigtime_t performance_time, bool immediate) { // send 'data not available' message if(mOutput.destination != media_destination::null) { - printf("ToneProducer: B_PRODUCER_STOPPED at %Ld\n", performance_time); + printf("ToneProducer: B_PRODUCER_STOPPED at %" B_PRIdBIGTIME "\n", + performance_time); SendDataStatus(B_PRODUCER_STOPPED, mOutput.destination, performance_time); } From 14bf5c32480a94a675f662fc82faf21da76778fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 21:24:47 +0200 Subject: [PATCH 111/136] preview print driver: fixes 64 bit warnings --- .../print/drivers/preview/JobSetupWindow.cpp | 2 +- .../print/drivers/preview/PrinterDriver.cpp | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/add-ons/print/drivers/preview/JobSetupWindow.cpp b/src/add-ons/print/drivers/preview/JobSetupWindow.cpp index 9ba38eb419..5d142469cf 100644 --- a/src/add-ons/print/drivers/preview/JobSetupWindow.cpp +++ b/src/add-ons/print/drivers/preview/JobSetupWindow.cpp @@ -121,7 +121,7 @@ void JobSetupWindow::UpdateJobMessage() { int32 from = 1; - int32 to = LONG_MAX; + int32 to = INT32_MAX; if (fAll->Value() == B_CONTROL_OFF) { from = atoi(fFrom->Text()); to = atoi(fTo->Text()); diff --git a/src/add-ons/print/drivers/preview/PrinterDriver.cpp b/src/add-ons/print/drivers/preview/PrinterDriver.cpp index 117e3ecdbc..ef2048f477 100644 --- a/src/add-ons/print/drivers/preview/PrinterDriver.cpp +++ b/src/add-ons/print/drivers/preview/PrinterDriver.cpp @@ -78,8 +78,8 @@ PrinterDriver::PrintJob(BFile *spoolFile, BMessage *jobMsg) printf("\n"); for (int32 page = 1; page <= pfh.page_count; ++page) { - printf("PrinterDriver::PrintPage(): Faking print of page %ld/ %ld\n", - page, pfh.page_count); + printf("PrinterDriver::PrintPage(): Faking print of page %" B_PRId32 + "/ %" B_PRId32 "\n", page, pfh.page_count); } fJobFile->Seek(0, SEEK_SET); @@ -87,9 +87,10 @@ PrinterDriver::PrintJob(BFile *spoolFile, BMessage *jobMsg) status_t status = reader.InitCheck(); printf("\nPrintJobReader::InitCheck(): %s\n", status == B_OK ? "B_OK" : "B_ERROR"); - printf("PrintJobReader::NumberOfPages(): %ld\n", reader.NumberOfPages()); - printf("PrintJobReader::FirstPage(): %ld\n", reader.FirstPage()); - printf("PrintJobReader::LastPage(): %ld\n", reader.LastPage()); + printf("PrintJobReader::NumberOfPages(): %" B_PRId32 "\n", + reader.NumberOfPages()); + printf("PrintJobReader::FirstPage(): %" B_PRId32 "\n", reader.FirstPage()); + printf("PrintJobReader::LastPage(): %" B_PRId32 "\n", reader.LastPage()); BRect rect = reader.PaperRect(); printf("PrintJobReader::PaperRect(): BRect(l:%.1f, t:%.1f, r:%.1f, b:%.1f)\n", @@ -101,7 +102,8 @@ PrinterDriver::PrintJob(BFile *spoolFile, BMessage *jobMsg) int32 xdpi, ydpi; reader.GetResolution(&xdpi, &ydpi); - printf("PrintJobReader::GetResolution(): xdpi:%ld, ydpi:%ld\n", xdpi, ydpi); + printf("PrintJobReader::GetResolution(): xdpi:%" B_PRId32 ", ydpi:%" + B_PRId32 "\n", xdpi, ydpi); printf("PrintJobReader::GetScale(): %.1f\n", reader.GetScale()); fPrinting = false; @@ -172,7 +174,7 @@ PrinterDriver::JobSetup(BMessage *jobMsg, const char *printerName) jobMsg->AddInt32("first_page", 1); if (!jobMsg->HasInt32("last_page")) - jobMsg->AddInt32("last_page", LONG_MAX); + jobMsg->AddInt32("last_page", INT32_MAX); BlockingWindow* w = NewJobSetupWindow(jobMsg, printerName); return w->Go(); From f39eb5cf94865c65b5442e80dbc7dd0618871242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 21:29:34 +0200 Subject: [PATCH 112/136] ipp and lpr print transports: fixes 64 bit warnings --- src/add-ons/print/transports/ipp/Ipp.cpp | 3 ++- src/add-ons/print/transports/ipp/IppTransport.cpp | 2 +- src/add-ons/print/transports/lpr/LprTransport.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/add-ons/print/transports/ipp/Ipp.cpp b/src/add-ons/print/transports/ipp/Ipp.cpp index b4a69983a3..2906be87de 100644 --- a/src/add-ons/print/transports/ipp/Ipp.cpp +++ b/src/add-ons/print/transports/ipp/Ipp.cpp @@ -93,7 +93,8 @@ IPPPrinterRoster::Listen() packet[len] = '\0'; // Verify packet format - if (sscanf(packet, "%lx%lx%1023s", &type, &state, uri) == 3) { + if (sscanf(packet, "%" B_SCNx32 "%" B_SCNx32 "%1023s", &type, &state, + uri) == 3) { IPPPrinter *printer = fPrinters.Get(uri); if (!printer) { printer = new IPPPrinter(uri, type); diff --git a/src/add-ons/print/transports/ipp/IppTransport.cpp b/src/add-ons/print/transports/ipp/IppTransport.cpp index 64814f1502..65b7c767bf 100644 --- a/src/add-ons/print/transports/ipp/IppTransport.cpp +++ b/src/add-ons/print/transports/ipp/IppTransport.cpp @@ -64,7 +64,7 @@ IppTransport::IppTransport(BMessage *msg) else strcpy(__user, "baron"); - sprintf(__file, "%s/%s@ipp.%ld", spool_path, __user, __jobid); + sprintf(__file, "%s/%s@ipp.%" B_PRId32, spool_path, __user, __jobid); __fs.open(__file, ios::in | ios::out | ios::binary | ios::trunc); if (__fs.good()) { diff --git a/src/add-ons/print/transports/lpr/LprTransport.cpp b/src/add-ons/print/transports/lpr/LprTransport.cpp index 8ac8daf536..6de02a45c5 100644 --- a/src/add-ons/print/transports/lpr/LprTransport.cpp +++ b/src/add-ons/print/transports/lpr/LprTransport.cpp @@ -66,7 +66,7 @@ LprTransport::LprTransport(BMessage *msg) } dir.WriteAttr(LPR_JOB_ID, B_INT32_TYPE, 0, &fJobId, sizeof(fJobId)); - sprintf(fFile, "%s/%s@ipp.%ld", spool_path, fUser, fJobId); + sprintf(fFile, "%s/%s@ipp.%" B_PRId32, spool_path, fUser, fJobId); fStream.open(fFile, ios::in | ios::out | ios::binary | ios::trunc); if (fStream.good()) { From 847f1a92bdf905637384fcf7f22940f2d069461c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 21:31:47 +0200 Subject: [PATCH 113/136] spider screen_saver: fixes 64 bit warnings --- src/add-ons/screen_savers/spider/Polygon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/add-ons/screen_savers/spider/Polygon.cpp b/src/add-ons/screen_savers/spider/Polygon.cpp index 71c401e12a..cec30cb3ee 100644 --- a/src/add-ons/screen_savers/spider/Polygon.cpp +++ b/src/add-ons/screen_savers/spider/Polygon.cpp @@ -39,7 +39,7 @@ Polygon::Polygon(BRect bounds, BList points) // destructor Polygon::~Polygon() { - while (point_vector* pv = (point_vector*)fPoints.RemoveItem(0L)) + while (point_vector* pv = (point_vector*)fPoints.RemoveItem((int32)0)) delete pv; } From b2b1ed3e229935fdb322b577b4f22048ac8d77ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 21:41:14 +0200 Subject: [PATCH 114/136] canna input method: fixes 64 bit warnings * ugly, this code is not really fixable anyway. --- src/add-ons/input_server/methods/canna/lib/kctrl.c | 4 ++-- src/add-ons/input_server/methods/canna/rk/dd.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/add-ons/input_server/methods/canna/lib/kctrl.c b/src/add-ons/input_server/methods/canna/lib/kctrl.c index fe0a7ab6f7..60e3f4f888 100644 --- a/src/add-ons/input_server/methods/canna/lib/kctrl.c +++ b/src/add-ons/input_server/methods/canna/lib/kctrl.c @@ -2039,7 +2039,7 @@ KC_changeServer(uiContext d, char *arg) return 0; } } - return (int)RkwGetServerName(); + return (int)(addr_t)RkwGetServerName(); } static int @@ -2103,7 +2103,7 @@ KC_setUserInfo(uiContext d, jrUserInfoStruct *arg) sprintf(buf, "%s/%s", uinfo->topdir ? uinfo->topdir : "", "default.can"); } - wcKanjiControl((int)d, KC_SETINITFILENAME, buf); + wcKanjiControl((int)(addr_t)d, KC_SETINITFILENAME, buf); RkwSetUserInfo(uinfo->uname, uinfo->gname, uinfo->topdir); ret = 1; goto return_ret; diff --git a/src/add-ons/input_server/methods/canna/rk/dd.c b/src/add-ons/input_server/methods/canna/rk/dd.c index 128cd49ec7..8b84d9b36d 100644 --- a/src/add-ons/input_server/methods/canna/rk/dd.c +++ b/src/add-ons/input_server/methods/canna/rk/dd.c @@ -688,7 +688,7 @@ _RkRealizeDD(struct DD *dd) int ret = -1; int tmpres; int fdes; - long tloc; + time_t tloc; char *whattime, *header, *dicsdir, *backup; whattime = (char *)malloc(RK_LINE_BMAX); From 6922a8fe9bc38cd0d953822aec8d74a6c010b051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 21:43:05 +0200 Subject: [PATCH 115/136] silicon_image_3112: fixes 64 bit warnings --- .../silicon_image_3112/silicon_image_3112.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/add-ons/kernel/busses/ata/silicon_image_3112/silicon_image_3112.c b/src/add-ons/kernel/busses/ata/silicon_image_3112/silicon_image_3112.c index d0037ddc9c..0038c4c842 100644 --- a/src/add-ons/kernel/busses/ata/silicon_image_3112/silicon_image_3112.c +++ b/src/add-ons/kernel/busses/ata/silicon_image_3112/silicon_image_3112.c @@ -69,7 +69,7 @@ typedef struct controller_data { uint32 int_num; area_id mmio_area; - uint32 mmio_addr; + addr_t mmio_addr; uint32 lost; // != 0 if device got removed, i.e. if it must not // be accessed anymore @@ -251,7 +251,7 @@ controller_init(device_node *node, void **_controllerCookie) pci_device *device; uint32 asicIndex; uint32 mmioBase; - uint32 mmioAddr; + addr_t mmioAddr; area_id mmioArea; uint32 interruptNumber; status_t res; @@ -286,10 +286,10 @@ controller_init(device_node *node, void **_controllerCookie) sDeviceManager->get_driver(parent, (driver_module_info **)&pci, (void **)&device); sDeviceManager->put_node(parent); - TRACE("asic index %ld\n", asicIndex); + TRACE("asic index %" B_PRId32 "\n", asicIndex); TRACE("asic name %s\n", kASICData[asicIndex].asic_name); - TRACE("int num %ld\n", interruptNumber); - TRACE("mmio addr %p\n", (void *)mmioAddr); + TRACE("int num %" B_PRId32 "\n", interruptNumber); + TRACE("mmio addr %" B_PRIxADDR"\n", mmioAddr); controller->pci = pci; controller->device = device; @@ -437,7 +437,7 @@ channel_init(device_node *node, void **_channelCookie) } #endif - TRACE("channel_index %ld\n", channelIndex); + TRACE("channel_index %" B_PRId32 "\n", channelIndex); TRACE("channel name: %s\n", kControllerChannelData[channelIndex].name); TRACE("channel %p\n", channel); @@ -685,19 +685,19 @@ dma_prepare(void *channelCookie, const physical_entry *sg_list, for (i = sg_list_count - 1, prd = channel->prdt; i >= 0; --i, ++prd, ++sg_list ) { - prd->address = B_HOST_TO_LENDIAN_INT32((uint32)pci->ram_address(device, + prd->address = B_HOST_TO_LENDIAN_INT32((uint32)(addr_t)pci->ram_address(device, (void*)(addr_t)sg_list->address)); // 0 means 64K - this is done automatically by discarding upper 16 bits prd->count = B_HOST_TO_LENDIAN_INT16((uint16)sg_list->size); prd->EOT = i == 0; - FLOW("%x, %x, %d\n", (int)prd->address, prd->count, prd->EOT); + FLOW("%" B_PRIx32", %" B_PRId16", %" B_PRId8"\n", prd->address, prd->count, prd->EOT); } // XXX move this to chan init? temp = (*channel->bm_prdt_address) & 3; - temp |= B_HOST_TO_LENDIAN_INT32((uint32)pci->ram_address(device, + temp |= B_HOST_TO_LENDIAN_INT32((uint32)(addr_t)pci->ram_address(device, (void *)(addr_t)channel->prdt_phys)) & ~3; *channel->bm_prdt_address = temp; From 215954e3e3ecb87542f584694ba050c7d0520d80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 22:31:23 +0200 Subject: [PATCH 116/136] FFilterByBuildFeatures: fixed typo --- build/jam/MiscRules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/jam/MiscRules b/build/jam/MiscRules index 32195453f9..7a140db2cb 100644 --- a/build/jam/MiscRules +++ b/build/jam/MiscRules @@ -502,7 +502,7 @@ rule FFilterByBuildFeatures list switch $(element) { case }@ : { - # Pop the topmost specificaton off the stack. + # Pop the topmost specification off the stack. evaluationStack = $(evaluationStack[2-]) ; if ! $(evaluationStack) { Exit "FFilterByBuildFeatures: Unbalanced @( in: " $(list) ; From 16a3940ccafe1383e45ff081ada241ab9435daad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 22:42:10 +0200 Subject: [PATCH 117/136] HaikuImage: added or removed targets for x86_64 * add vesa.accelerant, vesa driver, ps2, isa, bios, generic_x86 for x86_64 too * only have reiserfs, firewire, agp_gart targets for x86 * reverted hrev43950, liblocale alias shouldn't be needed anymore --- build/jam/HaikuImage | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index e2a5d849c9..afc4aa608d 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -104,6 +104,7 @@ SYSTEM_ADD_ONS_ACCELERANTS = [ FFilterByBuildFeatures #via.accelerant vmware.accelerant }@ # x86 ] ; +SYSTEM_ADD_ONS_ACCELERANTS += [ FFilterByBuildFeatures vesa.accelerant@x86_64 ] ; SYSTEM_ADD_ONS_TRANSLATORS = BMPTranslator EXRTranslator GIFTranslator HVIFTranslator ICOTranslator JPEGTranslator JPEG2000Translator PCXTranslator PNGTranslator PPMTranslator @@ -122,7 +123,7 @@ SYSTEM_ADD_ONS_MEDIA = [ FFilterByBuildFeatures usb_webcam.media_addon video_producer_demo.media_addon video_window_demo.media_addon - firewire_dv.media_addon + firewire_dv.media_addon@x86 #legacy.media_addon equalizer.media_addon vst_host.media_addon @@ -157,6 +158,7 @@ SYSTEM_ADD_ONS_DRIVERS_GRAPHICS = [ FFilterByBuildFeatures s3 vesa #via vmware }@ # x86 ] ; +SYSTEM_ADD_ONS_DRIVERS_GRAPHICS += [ FFilterByBuildFeatures vesa@x86_64 ] ; SYSTEM_ADD_ONS_DRIVERS_MIDI = emuxki ice1712 usb_midi ; SYSTEM_ADD_ONS_DRIVERS_NET = [ FFilterByBuildFeatures x86 @{ @@ -180,11 +182,11 @@ SYSTEM_ADD_ONS_DRIVERS_NET = [ FFilterByBuildFeatures ] ; SYSTEM_ADD_ONS_DRIVERS_POWER = [ FFilterByBuildFeatures acpi_button@x86 ] ; SYSTEM_ADD_ONS_BUS_MANAGERS = [ FFilterByBuildFeatures - ata@ata pci ps2@x86 isa@x86 - ide@ide scsi config_manager agp_gart usb firewire acpi@x86 + ata@ata pci ps2@x86,x86_64 isa@x86,x86_64 + ide@ide scsi config_manager agp_gart@x86 usb firewire@x86 acpi@x86 ] ; SYSTEM_ADD_ONS_FILE_SYSTEMS = bfs btrfs cdda exfat ext2 fat iso9660 nfs nfs4 - attribute_overlay write_overlay ntfs reiserfs udf googlefs ; + attribute_overlay write_overlay ntfs reiserfs@x86 udf googlefs ; # wifi firmware for driver in $(SYSTEM_ADD_ONS_DRIVERS_NET) { @@ -231,14 +233,14 @@ AddFilesToHaikuImage system add-ons kernel debugger AddFilesToHaikuImage system add-ons kernel file_systems : $(SYSTEM_ADD_ONS_FILE_SYSTEMS) ; AddFilesToHaikuImage system add-ons kernel generic - : ata_adapter@ata bios@x86 dpc ide_adapter@ide + : ata_adapter@ata bios@x86,x86_64 dpc ide_adapter@ide locked_pool mpu401 scsi_periph tty ; AddFilesToHaikuImage system add-ons kernel partitioning_systems : amiga_rdb apple efi_gpt intel session ; AddFilesToHaikuImage system add-ons kernel interrupt_controllers : openpic@ppc ; -if $(TARGET_ARCH) = x86 { +if $(TARGET_ARCH) = x86 || $(TARGET_ARCH) = x86_64 { AddFilesToHaikuImage system add-ons kernel cpu : generic_x86 ; } @@ -254,7 +256,7 @@ AddDriversToHaikuImage : console dprintf null AddDriversToHaikuImage audio hmulti : $(SYSTEM_ADD_ONS_DRIVERS_AUDIO) ; AddDriversToHaikuImage audio old : $(SYSTEM_ADD_ONS_DRIVERS_AUDIO_OLD) ; AddDriversToHaikuImage midi : $(SYSTEM_ADD_ONS_DRIVERS_MIDI) ; -AddDriversToHaikuImage bus : usb_raw fw_raw ; +AddDriversToHaikuImage bus : usb_raw fw_raw@x86 ; AddDriversToHaikuImage disk floppy : pc_floppy@x86 ; AddDriversToHaikuImage disk usb : usb_disk ; AddDriversToHaikuImage disk usb : usb_floppy ; @@ -301,22 +303,11 @@ if $(TARGET_ARCH) = x86 { } } -# libbe.so now includes what used to be in liblocale.so -# TODO: Remove this once all optional packages have been rebuilt (i.e. after -# next release)! -SYSTEM_LIBS_LIBBE_ALIASES = liblocale.so ; -if $(TARGET_ARCH) = x86 { - local lib ; - for lib in $(SYSTEM_LIBS_LIBBE_ALIASES) { - AddSymlinkToHaikuHybridImage system lib : libbe.so : $(lib) : : true ; - } -} SYSTEM_LIBS_ALIASES = $(SYSTEM_LIBS_LIBNETWORK_ALIASES) libnetapi.so $(SYSTEM_LIBS_LIBGL_ALIASES) - $(SYSTEM_LIBS_LIBBE_ALIASES) ; OPTIONAL_LIBS_ALIASES = From ef0c2a820bf1f11f12584307200b7a5cf95c9642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 22:51:42 +0200 Subject: [PATCH 118/136] HaikuImage: use the same HaikuImage Jamfile for x86 and x86_64 --- Jamfile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Jamfile b/Jamfile index 942323c29e..3ea234bde4 100644 --- a/Jamfile +++ b/Jamfile @@ -173,11 +173,7 @@ SubDir HAIKU_TOP ; UserBuildConfigRulePostBuildTargets ; # specify the Haiku image and network boot archive contents -if $(TARGET_ARCH) = x86_64 { - include [ FDirName $(HAIKU_BUILD_RULES_DIR) Haiku64Image ] ; -} else { - include [ FDirName $(HAIKU_BUILD_RULES_DIR) HaikuImage ] ; -} +include [ FDirName $(HAIKU_BUILD_RULES_DIR) HaikuImage ] ; include [ FDirName $(HAIKU_BUILD_RULES_DIR) NetBootArchive ] ; include [ FDirName $(HAIKU_BUILD_RULES_DIR) FloppyBootImage ] ; include [ FDirName $(HAIKU_BUILD_RULES_DIR) CDBootImage ] ; From 052e89004cc6bc892d2686a786ceb335db2ade96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 10 May 2013 23:09:46 +0200 Subject: [PATCH 119/136] HaikuImage: simplified a bit by combining two specification lists. --- build/jam/HaikuImage | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index afc4aa608d..d666bd3efc 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -97,14 +97,16 @@ SYSTEM_NETWORK_DATALINK_PROTOCOLS = ethernet_frame arp loopback_frame SYSTEM_NETWORK_PROTOCOLS = ipv4 tcp udp icmp unix icmp6 ipv6 ; SYSTEM_ADD_ONS_ACCELERANTS = [ FFilterByBuildFeatures + x86,x86_64 @{ + vesa.accelerant + }@ # x86,x86_64 x86 @{ 3dfx.accelerant ati.accelerant matrox.accelerant neomagic.accelerant nvidia.accelerant intel_810.accelerant intel_extreme.accelerant - radeon.accelerant radeon_hd.accelerant s3.accelerant vesa.accelerant + radeon.accelerant radeon_hd.accelerant s3.accelerant #via.accelerant vmware.accelerant }@ # x86 ] ; -SYSTEM_ADD_ONS_ACCELERANTS += [ FFilterByBuildFeatures vesa.accelerant@x86_64 ] ; SYSTEM_ADD_ONS_TRANSLATORS = BMPTranslator EXRTranslator GIFTranslator HVIFTranslator ICOTranslator JPEGTranslator JPEG2000Translator PCXTranslator PNGTranslator PPMTranslator @@ -153,12 +155,14 @@ SYSTEM_ADD_ONS_SCREENSAVERS = [ FFilterByBuildFeatures SYSTEM_ADD_ONS_DRIVERS_AUDIO = auich auvia echo3g emuxki hda ice1712 sis7018 ; SYSTEM_ADD_ONS_DRIVERS_AUDIO_OLD = ; #cmedia usb_audio ; SYSTEM_ADD_ONS_DRIVERS_GRAPHICS = [ FFilterByBuildFeatures + x86,x86_64 @{ + vesa + }@ # x86,x86_64 x86 @{ ati 3dfx intel_810 intel_extreme matrox neomagic nvidia radeon radeon_hd - s3 vesa #via vmware + s3 #via vmware }@ # x86 ] ; -SYSTEM_ADD_ONS_DRIVERS_GRAPHICS += [ FFilterByBuildFeatures vesa@x86_64 ] ; SYSTEM_ADD_ONS_DRIVERS_MIDI = emuxki ice1712 usb_midi ; SYSTEM_ADD_ONS_DRIVERS_NET = [ FFilterByBuildFeatures x86 @{ From 74ec65d8439c087c037adc141c418734d0b926d1 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Fri, 10 May 2013 18:21:00 -0400 Subject: [PATCH 120/136] Fix profile to recognize commpage image. --- src/bin/debug/profile/profile.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bin/debug/profile/profile.cpp b/src/bin/debug/profile/profile.cpp index dbe0d8f20a..dd50dcd81e 100644 --- a/src/bin/debug/profile/profile.cpp +++ b/src/bin/debug/profile/profile.cpp @@ -467,7 +467,9 @@ private: error = sharedImage->Init(name.String()); } - } else + } else if (strcmp(imageInfo.name, "commpage") == 0) + error = sharedImage->Init(teamID, imageInfo.id); + else error = sharedImage->Init(imageInfo.name); if (error != B_OK) return error; From a7000a02a09b6bc2c310b85bb4257d817efcff49 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 9 May 2013 23:53:29 +0200 Subject: [PATCH 121/136] Terminal: Add header VTKeyTbl.h ... exporting what is defined in VTKeyTbl.c. --- src/apps/terminal/VTKeyTbl.c | 4 ++++ src/apps/terminal/VTKeyTbl.h | 13 +++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 src/apps/terminal/VTKeyTbl.h diff --git a/src/apps/terminal/VTKeyTbl.c b/src/apps/terminal/VTKeyTbl.c index 51e877a611..ff5ada40f0 100644 --- a/src/apps/terminal/VTKeyTbl.c +++ b/src/apps/terminal/VTKeyTbl.c @@ -28,8 +28,12 @@ * */ + +#include "VTKeyTbl.h" + #include "VTkeymap.h" + int function_keycode_table[] = { F1_KEY, diff --git a/src/apps/terminal/VTKeyTbl.h b/src/apps/terminal/VTKeyTbl.h new file mode 100644 index 0000000000..8f4c284203 --- /dev/null +++ b/src/apps/terminal/VTKeyTbl.h @@ -0,0 +1,13 @@ +/* + * Copyright 2013 Ingo Weinhold, ingo_weinhold@gmx.de. All rights reserved. + * Distributed under the terms of the MIT license. + */ +#ifndef VT_KEY_TABLE_H +#define VT_KEY_TABLE_H + + +extern int function_keycode_table[]; +extern char* function_key_char_table[]; + + +#endif // VT_KEY_TABLE_H From bda35ef5dc71c1c4a4e831233f937bcb130bd284 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 9 May 2013 23:55:49 +0200 Subject: [PATCH 122/136] Terminal: Pull user input handling into state classes --- src/apps/terminal/Jamfile | 1 + src/apps/terminal/TermView.cpp | 413 ++------------------ src/apps/terminal/TermView.h | 25 +- src/apps/terminal/TermViewStates.cpp | 563 +++++++++++++++++++++++++++ src/apps/terminal/TermViewStates.h | 88 +++++ 5 files changed, 705 insertions(+), 385 deletions(-) create mode 100644 src/apps/terminal/TermViewStates.cpp create mode 100644 src/apps/terminal/TermViewStates.h diff --git a/src/apps/terminal/Jamfile b/src/apps/terminal/Jamfile index c8a114e927..7a480d917c 100644 --- a/src/apps/terminal/Jamfile +++ b/src/apps/terminal/Jamfile @@ -33,6 +33,7 @@ Application Terminal : TermParse.cpp TermScrollView.cpp TermView.cpp + TermViewStates.cpp TermWindow.cpp TitlePlaceholderMapper.cpp VTKeyTbl.c diff --git a/src/apps/terminal/TermView.cpp b/src/apps/terminal/TermView.cpp index 89faf10feb..b448017c37 100644 --- a/src/apps/terminal/TermView.cpp +++ b/src/apps/terminal/TermView.cpp @@ -62,22 +62,13 @@ #include "TermConst.h" #include "TerminalBuffer.h" #include "TerminalCharClassifier.h" +#include "TermViewStates.h" #include "VTkeymap.h" -// defined in VTKeyTbl.c -extern int function_keycode_table[]; -extern char *function_key_char_table[]; - #define ROWS_DEFAULT 25 #define COLUMNS_DEFAULT 80 -// selection granularity -enum { - SELECT_CHARS, - SELECT_WORDS, - SELECT_LINES -}; #undef B_TRANSLATION_CONTEXT #define B_TRANSLATION_CONTEXT "Terminal TermView" @@ -101,7 +92,6 @@ static property_info sPropList[] = { static const uint32 kUpdateSigWinch = 'Rwin'; static const uint32 kBlinkCursor = 'BlCr'; -static const uint32 kAutoScroll = 'AScr'; static const bigtime_t kSyncUpdateGranularity = 100000; // 0.1 s @@ -320,14 +310,15 @@ TermView::_InitObject(const ShellParameters& shellParameters) fConsiderClockedSync = false; fSelStart = TermPos(-1, -1); fSelEnd = TermPos(-1, -1); - fMouseTracking = false; - fCheckMouseTracking = false; fPrevPos = TermPos(-1, - 1); fReportX10MouseEvent = false; fReportNormalMouseEvent = false; fReportButtonMouseEvent = false; fReportAnyMouseEvent = false; fMouseClipboard = be_clipboard; + fDefaultState = new(std::nothrow) DefaultState(this); + fSelectState = new(std::nothrow) SelectState(this); + fActiveState = NULL; fTextBuffer = new(std::nothrow) TerminalBuffer; if (fTextBuffer == NULL) @@ -371,9 +362,14 @@ TermView::_InitObject(const ShellParameters& shellParameters) if (error < B_OK) return error; + if (fDefaultState == NULL || fSelectState == NULL) + return B_NO_MEMORY; + SetLowColor(fTextBackColor); SetViewColor(B_TRANSPARENT_32_BIT); + _NextState(fDefaultState); + return B_OK; } @@ -385,6 +381,8 @@ TermView::~TermView() _DetachShell(); + delete fDefaultState; + delete fSelectState; delete fSyncRunner; delete fAutoScrollRunner; delete fCharClassifier; @@ -1388,165 +1386,7 @@ TermView::MakeFocus(bool focusState) void TermView::KeyDown(const char *bytes, int32 numBytes) { - int32 key, mod, rawChar; - BMessage *currentMessage = Looper()->CurrentMessage(); - if (currentMessage == NULL) - return; - - currentMessage->FindInt32("modifiers", &mod); - currentMessage->FindInt32("key", &key); - currentMessage->FindInt32("raw_char", &rawChar); - - _ActivateCursor(true); - - // handle multi-byte chars - if (numBytes > 1) { - if (fEncoding != M_UTF8) { - char destBuffer[16]; - int32 destLen = sizeof(destBuffer); - int32 state = 0; - convert_from_utf8(fEncoding, bytes, &numBytes, destBuffer, - &destLen, &state, '?'); - _ScrollTo(0, true); - fShell->Write(destBuffer, destLen); - return; - } - - _ScrollTo(0, true); - fShell->Write(bytes, numBytes); - return; - } - - // Terminal filters RET, ENTER, F1...F12, and ARROW key code. - const char *toWrite = NULL; - - switch (*bytes) { - case B_RETURN: - if (rawChar == B_RETURN) - toWrite = "\r"; - break; - - case B_DELETE: - toWrite = DELETE_KEY_CODE; - break; - - case B_BACKSPACE: - // Translate only the actual backspace key to the backspace - // code. CTRL-H shall just be echoed. - if (!((mod & B_CONTROL_KEY) && rawChar == 'h')) - toWrite = BACKSPACE_KEY_CODE; - break; - - case B_LEFT_ARROW: - if (rawChar == B_LEFT_ARROW) { - if ((mod & B_SHIFT_KEY) != 0) { - if (fListener != NULL) - fListener->PreviousTermView(this); - return; - } - if ((mod & B_CONTROL_KEY) || (mod & B_COMMAND_KEY)) - toWrite = CTRL_LEFT_ARROW_KEY_CODE; - else - toWrite = LEFT_ARROW_KEY_CODE; - } - break; - - case B_RIGHT_ARROW: - if (rawChar == B_RIGHT_ARROW) { - if ((mod & B_SHIFT_KEY) != 0) { - if (fListener != NULL) - fListener->NextTermView(this); - return; - } - if ((mod & B_CONTROL_KEY) || (mod & B_COMMAND_KEY)) - toWrite = CTRL_RIGHT_ARROW_KEY_CODE; - else - toWrite = RIGHT_ARROW_KEY_CODE; - } - break; - - case B_UP_ARROW: - if (mod & B_SHIFT_KEY) { - _ScrollTo(fScrollOffset - fFontHeight, true); - return; - } - if (rawChar == B_UP_ARROW) { - if (mod & B_CONTROL_KEY) - toWrite = CTRL_UP_ARROW_KEY_CODE; - else - toWrite = UP_ARROW_KEY_CODE; - } - break; - - case B_DOWN_ARROW: - if (mod & B_SHIFT_KEY) { - _ScrollTo(fScrollOffset + fFontHeight, true); - return; - } - - if (rawChar == B_DOWN_ARROW) { - if (mod & B_CONTROL_KEY) - toWrite = CTRL_DOWN_ARROW_KEY_CODE; - else - toWrite = DOWN_ARROW_KEY_CODE; - } - break; - - case B_INSERT: - if (rawChar == B_INSERT) - toWrite = INSERT_KEY_CODE; - break; - - case B_HOME: - if (rawChar == B_HOME) - toWrite = HOME_KEY_CODE; - break; - - case B_END: - if (rawChar == B_END) - toWrite = END_KEY_CODE; - break; - - case B_PAGE_UP: - if (mod & B_SHIFT_KEY) { - _ScrollTo(fScrollOffset - fFontHeight * fRows, true); - return; - } - if (rawChar == B_PAGE_UP) - toWrite = PAGE_UP_KEY_CODE; - break; - - case B_PAGE_DOWN: - if (mod & B_SHIFT_KEY) { - _ScrollTo(fScrollOffset + fFontHeight * fRows, true); - return; - } - if (rawChar == B_PAGE_DOWN) - toWrite = PAGE_DOWN_KEY_CODE; - break; - - case B_FUNCTION_KEY: - for (int32 i = 0; i < 12; i++) { - if (key == function_keycode_table[i]) { - toWrite = function_key_char_table[i]; - break; - } - } - break; - } - - // If the above code proposed an alternative string to write, we get it's - // length. Otherwise we write exactly the bytes passed to this method. - size_t toWriteLen; - if (toWrite != NULL) { - toWriteLen = strlen(toWrite); - } else { - toWrite = bytes; - toWriteLen = numBytes; - } - - _ScrollTo(0, true); - fShell->Write(toWrite, toWriteLen); + fActiveState->KeyDown(bytes, numBytes); } @@ -1593,6 +1433,9 @@ TermView::FrameResized(float width, float height) void TermView::MessageReceived(BMessage *msg) { + if (fActiveState->MessageReceived(msg)) + return; + entry_ref ref; const char *ctrl_l = "\x0c"; @@ -1829,9 +1672,6 @@ TermView::MessageReceived(BMessage *msg) case kUpdateSigWinch: _UpdateSIGWINCH(); break; - case kAutoScroll: - _AutoScrollUpdate(); - break; case kSecondaryMouseDropAction: _DoSecondaryMouseDropAction(msg); break; @@ -2480,98 +2320,13 @@ TermView::MouseDown(BPoint where) if (!IsFocus()) MakeFocus(); - int32 buttons; - int32 modifier; - Window()->CurrentMessage()->FindInt32("buttons", &buttons); - Window()->CurrentMessage()->FindInt32("modifiers", &modifier); + BMessage* currentMessage = Window()->CurrentMessage(); + int32 buttons = currentMessage->GetInt32("buttons", 0); + int32 modifiers = currentMessage->GetInt32("modifiers", 0); + + fActiveState->MouseDown(where, buttons, modifiers); fMouseButtons = buttons; - - if (fReportAnyMouseEvent || fReportButtonMouseEvent - || fReportNormalMouseEvent || fReportX10MouseEvent) { - TermPos clickPos = _ConvertToTerminal(where); - _SendMouseEvent(buttons, modifier, clickPos.x, clickPos.y, false); - return; - } - - // paste button - if ((buttons & (B_SECONDARY_MOUSE_BUTTON | B_TERTIARY_MOUSE_BUTTON)) != 0) { - Paste(fMouseClipboard); - fLastClickPoint = where; - return; - } - - // Select Region - if (buttons == B_PRIMARY_MOUSE_BUTTON) { - int32 clicks; - Window()->CurrentMessage()->FindInt32("clicks", &clicks); - - if (_HasSelection()) { - TermPos inPos = _ConvertToTerminal(where); - if (_CheckSelectedRegion(inPos)) { - if (modifier & B_CONTROL_KEY) { - BPoint p; - uint32 bt; - do { - GetMouse(&p, &bt); - - if (bt == 0) { - _Deselect(); - return; - } - - snooze(40000); - - } while (abs((int)(where.x - p.x)) < 4 - && abs((int)(where.y - p.y)) < 4); - - InitiateDrag(); - return; - } - } - } - - // If mouse has moved too much, disable double/triple click. - if (_MouseDistanceSinceLastClick(where) > 8) - clicks = 1; - - SetMouseEventMask(B_POINTER_EVENTS | B_KEYBOARD_EVENTS, - B_NO_POINTER_HISTORY | B_LOCK_WINDOW_FOCUS); - - TermPos clickPos = _ConvertToTerminal(where); - - if (modifier & B_SHIFT_KEY) { - fInitialSelectionStart = clickPos; - fInitialSelectionEnd = clickPos; - _ExtendSelection(fInitialSelectionStart, true, false); - } else { - _Deselect(); - fInitialSelectionStart = clickPos; - fInitialSelectionEnd = clickPos; - } - - // If clicks larger than 3, reset mouse click counter. - clicks = (clicks - 1) % 3 + 1; - - switch (clicks) { - case 1: - fCheckMouseTracking = true; - fSelectGranularity = SELECT_CHARS; - break; - - case 2: - _SelectWord(where, (modifier & B_SHIFT_KEY) != 0, false); - fMouseTracking = true; - fSelectGranularity = SELECT_WORDS; - break; - - case 3: - _SelectLine(where, (modifier & B_SHIFT_KEY) != 0, false); - fMouseTracking = true; - fSelectGranularity = SELECT_LINES; - break; - } - } fLastClickPoint = where; } @@ -2579,111 +2334,17 @@ TermView::MouseDown(BPoint where) void TermView::MouseMoved(BPoint where, uint32 transit, const BMessage *message) { - if (fReportAnyMouseEvent || fReportButtonMouseEvent) { - int32 modifier; - Window()->CurrentMessage()->FindInt32("modifiers", &modifier); - - TermPos clickPos = _ConvertToTerminal(where); - - if (fReportButtonMouseEvent) { - if (fPrevPos.x != clickPos.x || fPrevPos.y != clickPos.y) { - _SendMouseEvent(fMouseButtons, modifier, clickPos.x, clickPos.y, - true); - } - fPrevPos = clickPos; - return; - } - _SendMouseEvent(fMouseButtons, modifier, clickPos.x, clickPos.y, true); - return; - } - - if (fCheckMouseTracking) { - if (_MouseDistanceSinceLastClick(where) > 9) - fMouseTracking = true; - } - if (!fMouseTracking) - return; - - bool doAutoScroll = false; - - if (where.y < 0) { - doAutoScroll = true; - fAutoScrollSpeed = where.y; - where.x = 0; - where.y = 0; - } - - BRect bounds(Bounds()); - if (where.y > bounds.bottom) { - doAutoScroll = true; - fAutoScrollSpeed = where.y - bounds.bottom; - where.x = bounds.right; - where.y = bounds.bottom; - } - - if (doAutoScroll) { - if (fAutoScrollRunner == NULL) { - BMessage message(kAutoScroll); - fAutoScrollRunner = new (std::nothrow) BMessageRunner( - BMessenger(this), &message, 10000); - } - } else { - delete fAutoScrollRunner; - fAutoScrollRunner = NULL; - } - - switch (fSelectGranularity) { - case SELECT_CHARS: - { - // If we just start selecting, we first select the initially - // hit char, so that we get a proper initial selection -- the char - // in question, which will thus always be selected, regardless of - // whether selecting forward or backward. - if (fInitialSelectionStart == fInitialSelectionEnd) { - _Select(fInitialSelectionStart, fInitialSelectionEnd, true, - true); - } - - _ExtendSelection(_ConvertToTerminal(where), true, true); - break; - } - case SELECT_WORDS: - _SelectWord(where, true, true); - break; - case SELECT_LINES: - _SelectLine(where, true, true); - break; - } + fActiveState->MouseMoved(where, transit, message); } void TermView::MouseUp(BPoint where) { - fCheckMouseTracking = false; - fMouseTracking = false; + int32 buttons = Window()->CurrentMessage()->GetInt32("buttons", 0); - if (fAutoScrollRunner != NULL) { - delete fAutoScrollRunner; - fAutoScrollRunner = NULL; - } + fActiveState->MouseUp(where, buttons); - // When releasing the first mouse button, we copy the selected text to the - // clipboard. - int32 buttons; - Window()->CurrentMessage()->FindInt32("buttons", &buttons); - - if (fReportAnyMouseEvent || fReportButtonMouseEvent - || fReportNormalMouseEvent) { - TermPos clickPos = _ConvertToTerminal(where); - _SendMouseEvent(0, 0, clickPos.x, clickPos.y, false); - } else { - if ((buttons & B_PRIMARY_MOUSE_BUTTON) == 0 - && (fMouseButtons & B_PRIMARY_MOUSE_BUTTON) != 0) { - Copy(fMouseClipboard); - } - - } fMouseButtons = buttons; } @@ -2844,22 +2505,6 @@ TermView::_SelectLine(BPoint where, bool extend, bool useInitialSelection) } -void -TermView::_AutoScrollUpdate() -{ - if (fMouseTracking && fAutoScrollRunner != NULL && fScrollBar != NULL) { - float value = fScrollBar->Value(); - _ScrollTo(value + fAutoScrollSpeed, true); - if (fAutoScrollSpeed < 0) { - _ExtendSelection(_ConvertToTerminal(BPoint(0, 0)), true, true); - } else { - _ExtendSelection(_ConvertToTerminal(Bounds().RightBottom()), true, - true); - } - } -} - - bool TermView::_CheckSelectedRegion(const TermPos &pos) const { @@ -3222,6 +2867,18 @@ TermView::_CancelInputMethod() } +void +TermView::_NextState(State* state) +{ + if (state != fActiveState) { + if (fActiveState != NULL) + fActiveState->Exited(); + fActiveState = state; + fActiveState->Entered(); + } +} + + // #pragma mark - Listener diff --git a/src/apps/terminal/TermView.h b/src/apps/terminal/TermView.h index 9e0721511a..429097db82 100644 --- a/src/apps/terminal/TermView.h +++ b/src/apps/terminal/TermView.h @@ -143,6 +143,16 @@ protected: private: class CharClassifier; + class State; + class StandardBaseState; + class DefaultState; + class SelectState; + + friend class State; + friend class StandardBaseState; + friend class DefaultState; + friend class SelectState; + private: // point and text offset conversion inline int32 _LineAt(float y); @@ -199,8 +209,6 @@ private: void _SelectLine(BPoint where, bool extend, bool useInitialSelection); - void _AutoScrollUpdate(); - bool _CheckSelectedRegion(const TermPos& pos) const; bool _CheckSelectedRegion(int32 row, int32 firstColumn, int32& lastColumn) const; @@ -218,6 +226,8 @@ private: void _HandleInputMethodLocationRequest(); void _CancelInputMethod(); + void _NextState(State* state); + private: Listener* fListener; Shell* fShell; @@ -252,8 +262,6 @@ private: // Cursor position. TermPos fCursor; - int32 fMouseButtons; - // Terminal rows and columns. int fColumns; int fRows; @@ -293,18 +301,21 @@ private: TermPos fSelEnd; TermPos fInitialSelectionStart; TermPos fInitialSelectionEnd; - bool fMouseTracking; - bool fCheckMouseTracking; - int fSelectGranularity; BPoint fLastClickPoint; // mouse + int32 fMouseButtons; TermPos fPrevPos; bool fReportX10MouseEvent; bool fReportNormalMouseEvent; bool fReportButtonMouseEvent; bool fReportAnyMouseEvent; BClipboard* fMouseClipboard; + + // states + DefaultState* fDefaultState; + SelectState* fSelectState; + State* fActiveState; }; diff --git a/src/apps/terminal/TermViewStates.cpp b/src/apps/terminal/TermViewStates.cpp new file mode 100644 index 0000000000..e74194dc18 --- /dev/null +++ b/src/apps/terminal/TermViewStates.cpp @@ -0,0 +1,563 @@ +/* + * Copyright 2001-2013, Haiku, Inc. + * Copyright 2003-2004 Kian Duffy, myob@users.sourceforge.net + * Parts Copyright 1998-1999 Kazuho Okui and Takashi Murai. + * All rights reserved. Distributed under the terms of the MIT license. + * + * Authors: + * Stefano Ceccherini, stefano.ceccherini@gmail.com + * Kian Duffy, myob@users.sourceforge.net + * Y.Hayakawa, hida@sawada.riec.tohoku.ac.jp + * Ingo Weinhold, ingo_weinhold@gmx.de + * Clemens Zeidler, haiku@Clemens-Zeidler.de + * Siarzhuk Zharski, zharik@gmx.li + */ + + +#include "TermViewStates.h" + +#include +#include +#include +#include + +#include "Shell.h" +#include "TermConst.h" +#include "VTkeymap.h" +#include "VTKeyTbl.h" + + +// selection granularity +enum { + SELECT_CHARS, + SELECT_WORDS, + SELECT_LINES +}; + +static const uint32 kAutoScroll = 'AScr'; + + +// #pragma mark - State + + +TermView::State::State(TermView* view) + : + fView(view) +{ +} + + +TermView::State::~State() +{ +} + + +void +TermView::State::Entered() +{ +} + + +void +TermView::State::Exited() +{ +} + + +bool +TermView::State::MessageReceived(BMessage* message) +{ + return false; +} + + +void +TermView::State::KeyDown(const char* bytes, int32 numBytes) +{ +} + + +void +TermView::State::MouseDown(BPoint where, int32 buttons, int32 modifiers) +{ +} + + +void +TermView::State::MouseMoved(BPoint where, uint32 transit, + const BMessage* message) +{ +} + + +void +TermView::State::MouseUp(BPoint where, int32 buttons) +{ +} + + +// #pragma mark - StandardBaseState + + +TermView::StandardBaseState::StandardBaseState(TermView* view) + : + State(view) +{ +} + + +bool +TermView::StandardBaseState::_StandardMouseMoved(BPoint where) +{ + if (!fView->fReportAnyMouseEvent && !fView->fReportButtonMouseEvent) + return false; + + int32 modifier; + fView->Window()->CurrentMessage()->FindInt32("modifiers", &modifier); + + TermPos clickPos = fView->_ConvertToTerminal(where); + + if (fView->fReportButtonMouseEvent) { + if (fView->fPrevPos.x != clickPos.x + || fView->fPrevPos.y != clickPos.y) { + fView->_SendMouseEvent(fView->fMouseButtons, modifier, + clickPos.x, clickPos.y, true); + } + fView->fPrevPos = clickPos; + } else { + fView->_SendMouseEvent(fView->fMouseButtons, modifier, clickPos.x, + clickPos.y, true); + } + + return true; +} + + +// #pragma mark - DefaultState + + +TermView::DefaultState::DefaultState(TermView* view) + : + StandardBaseState(view) +{ +} + + +void +TermView::DefaultState::KeyDown(const char* bytes, int32 numBytes) +{ + int32 key, mod, rawChar; + BMessage *currentMessage = fView->Looper()->CurrentMessage(); + if (currentMessage == NULL) + return; + + currentMessage->FindInt32("modifiers", &mod); + currentMessage->FindInt32("key", &key); + currentMessage->FindInt32("raw_char", &rawChar); + + fView->_ActivateCursor(true); + + // handle multi-byte chars + if (numBytes > 1) { + if (fView->fEncoding != M_UTF8) { + char destBuffer[16]; + int32 destLen = sizeof(destBuffer); + int32 state = 0; + convert_from_utf8(fView->fEncoding, bytes, &numBytes, destBuffer, + &destLen, &state, '?'); + fView->_ScrollTo(0, true); + fView->fShell->Write(destBuffer, destLen); + return; + } + + fView->_ScrollTo(0, true); + fView->fShell->Write(bytes, numBytes); + return; + } + + // Terminal filters RET, ENTER, F1...F12, and ARROW key code. + const char *toWrite = NULL; + + switch (*bytes) { + case B_RETURN: + if (rawChar == B_RETURN) + toWrite = "\r"; + break; + + case B_DELETE: + toWrite = DELETE_KEY_CODE; + break; + + case B_BACKSPACE: + // Translate only the actual backspace key to the backspace + // code. CTRL-H shall just be echoed. + if (!((mod & B_CONTROL_KEY) && rawChar == 'h')) + toWrite = BACKSPACE_KEY_CODE; + break; + + case B_LEFT_ARROW: + if (rawChar == B_LEFT_ARROW) { + if ((mod & B_SHIFT_KEY) != 0) { + if (fView->fListener != NULL) + fView->fListener->PreviousTermView(fView); + return; + } + if ((mod & B_CONTROL_KEY) || (mod & B_COMMAND_KEY)) + toWrite = CTRL_LEFT_ARROW_KEY_CODE; + else + toWrite = LEFT_ARROW_KEY_CODE; + } + break; + + case B_RIGHT_ARROW: + if (rawChar == B_RIGHT_ARROW) { + if ((mod & B_SHIFT_KEY) != 0) { + if (fView->fListener != NULL) + fView->fListener->NextTermView(fView); + return; + } + if ((mod & B_CONTROL_KEY) || (mod & B_COMMAND_KEY)) + toWrite = CTRL_RIGHT_ARROW_KEY_CODE; + else + toWrite = RIGHT_ARROW_KEY_CODE; + } + break; + + case B_UP_ARROW: + if (mod & B_SHIFT_KEY) { + fView->_ScrollTo(fView->fScrollOffset - fView->fFontHeight, + true); + return; + } + if (rawChar == B_UP_ARROW) { + if (mod & B_CONTROL_KEY) + toWrite = CTRL_UP_ARROW_KEY_CODE; + else + toWrite = UP_ARROW_KEY_CODE; + } + break; + + case B_DOWN_ARROW: + if (mod & B_SHIFT_KEY) { + fView->_ScrollTo(fView->fScrollOffset + fView->fFontHeight, + true); + return; + } + + if (rawChar == B_DOWN_ARROW) { + if (mod & B_CONTROL_KEY) + toWrite = CTRL_DOWN_ARROW_KEY_CODE; + else + toWrite = DOWN_ARROW_KEY_CODE; + } + break; + + case B_INSERT: + if (rawChar == B_INSERT) + toWrite = INSERT_KEY_CODE; + break; + + case B_HOME: + if (rawChar == B_HOME) + toWrite = HOME_KEY_CODE; + break; + + case B_END: + if (rawChar == B_END) + toWrite = END_KEY_CODE; + break; + + case B_PAGE_UP: + if (mod & B_SHIFT_KEY) { + fView->_ScrollTo( + fView->fScrollOffset - fView->fFontHeight * fView->fRows, + true); + return; + } + if (rawChar == B_PAGE_UP) + toWrite = PAGE_UP_KEY_CODE; + break; + + case B_PAGE_DOWN: + if (mod & B_SHIFT_KEY) { + fView->_ScrollTo( + fView->fScrollOffset + fView->fFontHeight * fView->fRows, + true); + return; + } + if (rawChar == B_PAGE_DOWN) + toWrite = PAGE_DOWN_KEY_CODE; + break; + + case B_FUNCTION_KEY: + for (int32 i = 0; i < 12; i++) { + if (key == function_keycode_table[i]) { + toWrite = function_key_char_table[i]; + break; + } + } + break; + } + + // If the above code proposed an alternative string to write, we get it's + // length. Otherwise we write exactly the bytes passed to this method. + size_t toWriteLen; + if (toWrite != NULL) { + toWriteLen = strlen(toWrite); + } else { + toWrite = bytes; + toWriteLen = numBytes; + } + + fView->_ScrollTo(0, true); + fView->fShell->Write(toWrite, toWriteLen); +} + + +void +TermView::DefaultState::MouseDown(BPoint where, int32 buttons, int32 modifiers) +{ + if (fView->fReportAnyMouseEvent || fView->fReportButtonMouseEvent + || fView->fReportNormalMouseEvent || fView->fReportX10MouseEvent) { + TermPos clickPos = fView->_ConvertToTerminal(where); + fView->_SendMouseEvent(buttons, modifiers, clickPos.x, clickPos.y, + false); + return; + } + + // paste button + if ((buttons & (B_SECONDARY_MOUSE_BUTTON | B_TERTIARY_MOUSE_BUTTON)) != 0) { + fView->Paste(fView->fMouseClipboard); + return; + } + + // Select Region + if (buttons == B_PRIMARY_MOUSE_BUTTON) { + fView->fSelectState->Prepare(where, modifiers); + fView->_NextState(fView->fSelectState); + } +} + + +void +TermView::DefaultState::MouseMoved(BPoint where, uint32 transit, + const BMessage* message) +{ + _StandardMouseMoved(where); +} + + +// #pragma mark - SelectState + + +TermView::SelectState::SelectState(TermView* view) + : + StandardBaseState(view), + fSelectGranularity(SELECT_CHARS), + fCheckMouseTracking(false), + fMouseTracking(false) +{ +} + + +void +TermView::SelectState::Prepare(BPoint where, int32 modifiers) +{ + int32 clicks; + fView->Window()->CurrentMessage()->FindInt32("clicks", &clicks); + + if (fView->_HasSelection()) { + TermPos inPos = fView->_ConvertToTerminal(where); + if (fView->_CheckSelectedRegion(inPos)) { + if (modifiers & B_CONTROL_KEY) { + BPoint p; + uint32 bt; + do { + fView->GetMouse(&p, &bt); + + if (bt == 0) { + fView->_Deselect(); + return; + } + + snooze(40000); + + } while (abs((int)(where.x - p.x)) < 4 + && abs((int)(where.y - p.y)) < 4); + + fView->InitiateDrag(); + return; + } + } + } + + // If mouse has moved too much, disable double/triple click. + if (fView->_MouseDistanceSinceLastClick(where) > 8) + clicks = 1; + + fView->SetMouseEventMask(B_POINTER_EVENTS | B_KEYBOARD_EVENTS, + B_NO_POINTER_HISTORY | B_LOCK_WINDOW_FOCUS); + + TermPos clickPos = fView->_ConvertToTerminal(where); + + if (modifiers & B_SHIFT_KEY) { + fView->fInitialSelectionStart = clickPos; + fView->fInitialSelectionEnd = clickPos; + fView->_ExtendSelection(fView->fInitialSelectionStart, true, false); + } else { + fView->_Deselect(); + fView->fInitialSelectionStart = clickPos; + fView->fInitialSelectionEnd = clickPos; + } + + // If clicks larger than 3, reset mouse click counter. + clicks = (clicks - 1) % 3 + 1; + + switch (clicks) { + case 1: + fCheckMouseTracking = true; + fSelectGranularity = SELECT_CHARS; + break; + + case 2: + fView->_SelectWord(where, (modifiers & B_SHIFT_KEY) != 0, false); + fMouseTracking = true; + fSelectGranularity = SELECT_WORDS; + break; + + case 3: + fView->_SelectLine(where, (modifiers & B_SHIFT_KEY) != 0, false); + fMouseTracking = true; + fSelectGranularity = SELECT_LINES; + break; + } +} + + +bool +TermView::SelectState::MessageReceived(BMessage* message) +{ + if (message->what == kAutoScroll) { + _AutoScrollUpdate(); + return true; + } + + return false; +} + + +void +TermView::SelectState::MouseMoved(BPoint where, uint32 transit, + const BMessage* message) +{ + if (_StandardMouseMoved(where)) + return; + + if (fCheckMouseTracking) { + if (fView->_MouseDistanceSinceLastClick(where) > 9) + fMouseTracking = true; + } + if (!fMouseTracking) + return; + + bool doAutoScroll = false; + + if (where.y < 0) { + doAutoScroll = true; + fView->fAutoScrollSpeed = where.y; + where.x = 0; + where.y = 0; + } + + BRect bounds(fView->Bounds()); + if (where.y > bounds.bottom) { + doAutoScroll = true; + fView->fAutoScrollSpeed = where.y - bounds.bottom; + where.x = bounds.right; + where.y = bounds.bottom; + } + + if (doAutoScroll) { + if (fView->fAutoScrollRunner == NULL) { + BMessage message(kAutoScroll); + fView->fAutoScrollRunner = new (std::nothrow) BMessageRunner( + BMessenger(fView), &message, 10000); + } + } else { + delete fView->fAutoScrollRunner; + fView->fAutoScrollRunner = NULL; + } + + switch (fSelectGranularity) { + case SELECT_CHARS: + { + // If we just start selecting, we first select the initially + // hit char, so that we get a proper initial selection -- the char + // in question, which will thus always be selected, regardless of + // whether selecting forward or backward. + if (fView->fInitialSelectionStart == fView->fInitialSelectionEnd) { + fView->_Select(fView->fInitialSelectionStart, + fView->fInitialSelectionEnd, true, true); + } + + fView->_ExtendSelection(fView->_ConvertToTerminal(where), true, + true); + break; + } + case SELECT_WORDS: + fView->_SelectWord(where, true, true); + break; + case SELECT_LINES: + fView->_SelectLine(where, true, true); + break; + } +} + + +void +TermView::SelectState::MouseUp(BPoint where, int32 buttons) +{ + fCheckMouseTracking = false; + fMouseTracking = false; + + if (fView->fAutoScrollRunner != NULL) { + delete fView->fAutoScrollRunner; + fView->fAutoScrollRunner = NULL; + } + + // When releasing the first mouse button, we copy the selected text to the + // clipboard. + + if (fView->fReportAnyMouseEvent || fView->fReportButtonMouseEvent + || fView->fReportNormalMouseEvent) { + TermPos clickPos = fView->_ConvertToTerminal(where); + fView->_SendMouseEvent(0, 0, clickPos.x, clickPos.y, false); + } else { + if ((buttons & B_PRIMARY_MOUSE_BUTTON) == 0 + && (fView->fMouseButtons & B_PRIMARY_MOUSE_BUTTON) != 0) { + fView->Copy(fView->fMouseClipboard); + } + + } + + fView->_NextState(fView->fDefaultState); +} + + +void +TermView::SelectState::_AutoScrollUpdate() +{ + if (fMouseTracking && fView->fAutoScrollRunner != NULL + && fView->fScrollBar != NULL) { + float value = fView->fScrollBar->Value(); + fView->_ScrollTo(value + fView->fAutoScrollSpeed, true); + if (fView->fAutoScrollSpeed < 0) { + fView->_ExtendSelection( + fView->_ConvertToTerminal(BPoint(0, 0)), true, true); + } else { + fView->_ExtendSelection( + fView->_ConvertToTerminal(fView->Bounds().RightBottom()), true, + true); + } + } +} diff --git a/src/apps/terminal/TermViewStates.h b/src/apps/terminal/TermViewStates.h new file mode 100644 index 0000000000..26ff862069 --- /dev/null +++ b/src/apps/terminal/TermViewStates.h @@ -0,0 +1,88 @@ +/* + * Copyright 2001-2013, Haiku, Inc. + * Copyright (c) 2003-4 Kian Duffy + * Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai. + * + * Distributed under the terms of the MIT license. + * Authors: + * Stefano Ceccherini, stefano.ceccherini@gmail.com + * Kian Duffy, myob@users.sourceforge.net + * Ingo Weinhold, ingo_weinhold@gmx.de + * Siarzhuk Zharski, zharik@gmx.li + */ +#ifndef TERMVIEW_STATES_H +#define TERMVIEW_STATES_H + + +#include "TermView.h" + + +class TermView::State { +public: + State(TermView* view); + virtual ~State(); + + virtual void Entered(); + virtual void Exited(); + + virtual bool MessageReceived(BMessage* message); + // returns true, if handled + + virtual void KeyDown(const char* bytes, int32 numBytes); + + virtual void MouseDown(BPoint where, int32 buttons, + int32 modifiers); + virtual void MouseMoved(BPoint where, uint32 transit, + const BMessage* message); + virtual void MouseUp(BPoint where, int32 buttons); + +protected: + TermView* fView; +}; + + +class TermView::StandardBaseState : public TermView::State { +public: + StandardBaseState(TermView* view); + +protected: + bool _StandardMouseMoved(BPoint where); +}; + + +class TermView::DefaultState : public TermView::StandardBaseState { +public: + DefaultState(TermView* view); + + virtual void KeyDown(const char* bytes, int32 numBytes); + + virtual void MouseDown(BPoint where, int32 buttons, + int32 modifiers); + virtual void MouseMoved(BPoint where, uint32 transit, + const BMessage* message); +}; + + +class TermView::SelectState : public TermView::StandardBaseState { +public: + SelectState(TermView* view); + + void Prepare(BPoint where, int32 modifiers); + + virtual bool MessageReceived(BMessage* message); + + virtual void MouseMoved(BPoint where, uint32 transit, + const BMessage* message); + virtual void MouseUp(BPoint where, int32 buttons); + +private: + void _AutoScrollUpdate(); + +private: + int32 fSelectGranularity; + bool fCheckMouseTracking; + bool fMouseTracking; +}; + + +#endif // TERMVIEW_STATES_H From 314e8a20c6828d67b6f4c2362710c0a9ae27bc08 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 11 May 2013 01:03:39 +0200 Subject: [PATCH 123/136] BasicTerminalBuffer: Add {Previous,Next}LinePos() --- src/apps/terminal/BasicTerminalBuffer.cpp | 119 +++++++++++++++------- src/apps/terminal/BasicTerminalBuffer.h | 13 +++ 2 files changed, 98 insertions(+), 34 deletions(-) diff --git a/src/apps/terminal/BasicTerminalBuffer.cpp b/src/apps/terminal/BasicTerminalBuffer.cpp index f5bcd6199a..dfbb54e28d 100644 --- a/src/apps/terminal/BasicTerminalBuffer.cpp +++ b/src/apps/terminal/BasicTerminalBuffer.cpp @@ -431,48 +431,31 @@ BasicTerminalBuffer::FindWord(const TermPos& pos, TermPos start(x, y); TermPos end(x + (IS_WIDTH(line->cells[x].attributes) ? FULL_WIDTH : HALF_WIDTH), y); - while (true) { - if (--x < 0) { - // Hit the beginning of the line -- continue at the end of the - // previous line, if it soft-breaks. - y--; - if ((line = _HistoryLineAt(y, lineBuffer)) == NULL - || !line->softBreak || line->length == 0) { - break; - } - x = line->length - 1; - } - if (x > 0 && IS_WIDTH(line->cells[x - 1].attributes)) - x--; - - if (classifier->Classify(line->cells[x].character) != type) + for (;;) { + TermPos previousPos = start; + if (!_PreviousLinePos(lineBuffer, line, previousPos) + || classifier->Classify(line->cells[previousPos.x].character) + != type) { break; + } - start.SetTo(x, y); + start = previousPos; } // find the end - x = end.x; - y = end.y; - line = _HistoryLineAt(y, lineBuffer); + line = _HistoryLineAt(end.y, lineBuffer); - while (true) { - if (x >= line->length) { - // Hit the end of the line -- if it soft-breaks continue with the - // next line. - if (!line->softBreak) - break; - y++; - x = 0; - if ((line = _HistoryLineAt(y, lineBuffer)) == NULL) - break; - } - - if (classifier->Classify(line->cells[x].character) != type) + for (;;) { + TermPos nextPos = end; + if (!_NormalizeLinePos(lineBuffer, line, nextPos)) break; - x += IS_WIDTH(line->cells[x].attributes) ? FULL_WIDTH : HALF_WIDTH; - end.SetTo(x, y); + if (classifier->Classify(line->cells[nextPos.x].character) != type) + break; + + nextPos.x += IS_WIDTH(line->cells[nextPos.x].attributes) + ? FULL_WIDTH : HALF_WIDTH; + end = nextPos; } _start = start; @@ -481,6 +464,34 @@ BasicTerminalBuffer::FindWord(const TermPos& pos, } +bool +BasicTerminalBuffer::PreviousLinePos(TermPos& pos) const +{ + TerminalLine* lineBuffer = ALLOC_LINE_ON_STACK(fWidth); + TerminalLine* line = _HistoryLineAt(pos.y, lineBuffer); + if (line == NULL || pos.x < 0 || pos.x >= fWidth) + return false; + + return _PreviousLinePos(lineBuffer, line, pos); +} + + +bool +BasicTerminalBuffer::NextLinePos(TermPos& pos, bool normalize) const +{ + TerminalLine* lineBuffer = ALLOC_LINE_ON_STACK(fWidth); + TerminalLine* line = _HistoryLineAt(pos.y, lineBuffer); + if (line == NULL || pos.x < 0 || pos.x > fWidth) + return false; + + if (!_NormalizeLinePos(lineBuffer, line, pos)) + return false; + + pos.x += IS_WIDTH(line->cells[pos.x].attributes) ? FULL_WIDTH : HALF_WIDTH; + return !normalize || _NormalizeLinePos(lineBuffer, line, pos); +} + + int32 BasicTerminalBuffer::LineLength(int32 index) const { @@ -1692,6 +1703,46 @@ BasicTerminalBuffer::_NextChar(TermPos& pos, UTF8Char& c) const } +bool +BasicTerminalBuffer::_PreviousLinePos(TerminalLine* lineBuffer, + TerminalLine*& line, TermPos& pos) const +{ + if (--pos.x < 0) { + // Hit the beginning of the line -- continue at the end of the + // previous line, if it soft-breaks. + pos.y--; + if ((line = _HistoryLineAt(pos.y, lineBuffer)) == NULL + || !line->softBreak || line->length == 0) { + return false; + } + pos.x = line->length - 1; + } + if (pos.x > 0 && IS_WIDTH(line->cells[pos.x - 1].attributes)) + pos.x--; + + return true; +} + + +bool +BasicTerminalBuffer::_NormalizeLinePos(TerminalLine* lineBuffer, + TerminalLine*& line, TermPos& pos) const +{ + if (pos.x < line->length) + return true; + + // Hit the end of the line -- if it soft-breaks continue with the + // next line. + if (!line->softBreak) + return false; + + pos.y++; + pos.x = 0; + line = _HistoryLineAt(pos.y, lineBuffer); + return line != NULL; +} + + #ifdef USE_DEBUG_SNAPSHOTS void diff --git a/src/apps/terminal/BasicTerminalBuffer.h b/src/apps/terminal/BasicTerminalBuffer.h index ed30bb09f2..757984f6b2 100644 --- a/src/apps/terminal/BasicTerminalBuffer.h +++ b/src/apps/terminal/BasicTerminalBuffer.h @@ -107,6 +107,14 @@ public: int32 LineLength(int32 index) const; int32 GetLineColor(int32 index) const; + bool PreviousLinePos(TermPos& pos) const; + bool NextLinePos(TermPos& pos, bool normalize) const; + // normalize specifies that the returned + // position must be a valid position, i.e. + // actually point to a character (as opposed + // to just pointing to the position after a + // character). + bool Find(const char* pattern, const TermPos& start, bool forward, bool caseSensitive, bool matchWord, TermPos& matchStart, @@ -205,6 +213,11 @@ protected: bool _PreviousChar(TermPos& pos, UTF8Char& c) const; bool _NextChar(TermPos& pos, UTF8Char& c) const; + bool _PreviousLinePos(TerminalLine* lineBuffer, + TerminalLine*& line, TermPos& pos) const; + bool _NormalizeLinePos(TerminalLine* lineBuffer, + TerminalLine*& line, TermPos& pos) const; + protected: // screen width/height int32 fWidth; From e9bad28aafc6b71378bb71139cde6269bbb0afa7 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 11 May 2013 01:09:17 +0200 Subject: [PATCH 124/136] Terminal: Add a hyperlink mode When holding down Command, text under the mouse is checked whether it looks like a URL or a local path. If so, it is highlighted and can be clicked, which will open the URL/file. Right-clicking opens a context menu with items for opening the link/file or copying it to the clipboard. When additionally holding down Shift, path prefixes up to the component under the mouse will be considered (no effect for URLs). Changes: * Add HyperLink class. Encapsulates a type, the address, and an optional base address. Features an Open() method to open the address. * Move/add some string constants to TermConst. * Move TermView::CharClassifier to top level and rename to DefaultCharClassifier. * Introduce TermViewHighlight and TermViewHighlighter. The former refers to a range of text in a TermView's text buffer. It also contains a pointer to a TermViewHighlighter object, which specifies how the text range shall be rendered (colors and attributes). * TermView: - Add respective _{Add,Remove}Highlight() methods and adjust the code to support highlights. - Make the selection a TermViewHighlight. At least its visual aspect is now handled like other highlights. - Introduce an inner TextBufferSyncLocker. It is used instead of BAutolock when locking the text buffer to synchronize the visual buffer with it. After it unlocks it calls _VisibleTextBufferChanged(), if the visual text buffer has changed, which in turn calls a new callback on the active state. - Add WindowActivated() and ModifiersChanged() callbacks to the state interface. - Add new states HyperLinkState and HyperLinkMenuState which implement the new feature. Fix modifier issues --- src/apps/terminal/HyperLink.cpp | 45 ++ src/apps/terminal/HyperLink.h | 41 ++ src/apps/terminal/Jamfile | 2 + src/apps/terminal/TermConst.cpp | 4 + src/apps/terminal/TermConst.h | 4 + src/apps/terminal/TermView.cpp | 361 ++++++++++----- src/apps/terminal/TermView.h | 48 +- src/apps/terminal/TermViewHighlight.cpp | 19 + src/apps/terminal/TermViewHighlight.h | 83 ++++ src/apps/terminal/TermViewStates.cpp | 462 ++++++++++++++++++- src/apps/terminal/TermViewStates.h | 88 +++- src/apps/terminal/TerminalCharClassifier.cpp | 43 +- src/apps/terminal/TerminalCharClassifier.h | 19 +- 13 files changed, 1067 insertions(+), 152 deletions(-) create mode 100644 src/apps/terminal/HyperLink.cpp create mode 100644 src/apps/terminal/HyperLink.h create mode 100644 src/apps/terminal/TermViewHighlight.cpp create mode 100644 src/apps/terminal/TermViewHighlight.h diff --git a/src/apps/terminal/HyperLink.cpp b/src/apps/terminal/HyperLink.cpp new file mode 100644 index 0000000000..97e294f7eb --- /dev/null +++ b/src/apps/terminal/HyperLink.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include "HyperLink.h" + +#include +#include + +#include "TermConst.h" + + +HyperLink::HyperLink() + : + fAddress(), + fType(TYPE_URL) +{ +} + + +HyperLink::HyperLink(const BString& address, Type type, + const BString& baseAddress) + : + fAddress(address), + fBaseAddress(baseAddress.IsEmpty() ? address : baseAddress), + fType(type) +{ +} + + +status_t +HyperLink::Open() +{ + if (!IsValid()) + return B_BAD_VALUE; + + // open with the "open" program + BString address(fAddress); + address.CharacterEscape(kShellEscapeCharacters, '\\'); + BString commandLine; + commandLine.SetToFormat("/bin/open %s", address.String()); + return system(commandLine) == 0 ? B_OK : errno; +} diff --git a/src/apps/terminal/HyperLink.h b/src/apps/terminal/HyperLink.h new file mode 100644 index 0000000000..735c84c50f --- /dev/null +++ b/src/apps/terminal/HyperLink.h @@ -0,0 +1,41 @@ +/* + * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef HYPER_LINK_H +#define HYPER_LINK_H + + +#include + + +class HyperLink { +public: + enum Type { + TYPE_URL, + TYPE_PATH, + TYPE_PATH_WITH_LINE, + TYPE_PATH_WITH_LINE_AND_COLUMN + }; + +public: + HyperLink(); + HyperLink(const BString& address, Type type, + const BString& baseAddress = BString()); + + bool IsValid() const { return !fAddress.IsEmpty(); } + + const BString& Address() const { return fAddress; } + const BString& BaseAddress() const { return fBaseAddress; } + Type GetType() const { return fType; } + + status_t Open(); + +private: + BString fAddress; + BString fBaseAddress; + Type fType; +}; + + +#endif // HYPER_LINK_H diff --git a/src/apps/terminal/Jamfile b/src/apps/terminal/Jamfile index 7a480d917c..98a062afa8 100644 --- a/src/apps/terminal/Jamfile +++ b/src/apps/terminal/Jamfile @@ -16,6 +16,7 @@ Application Terminal : FindWindow.cpp Globals.cpp HistoryBuffer.cpp + HyperLink.cpp InlineInput.cpp PatternEvaluator.cpp PrefHandler.cpp @@ -33,6 +34,7 @@ Application Terminal : TermParse.cpp TermScrollView.cpp TermView.cpp + TermViewHighlight.cpp TermViewStates.cpp TermWindow.cpp TitlePlaceholderMapper.cpp diff --git a/src/apps/terminal/TermConst.cpp b/src/apps/terminal/TermConst.cpp index 1b88bc0493..2e2c9cdf6a 100644 --- a/src/apps/terminal/TermConst.cpp +++ b/src/apps/terminal/TermConst.cpp @@ -31,3 +31,7 @@ const char* const kTooTipSetWindowTitlePlaceholders = B_TRANSLATE( "\t%p\t-\tThe name of the active process in the current tab.\n" "\t%t\t-\tThe title of the current tab.\n" "\t%%\t-\tThe character '%'."); + +const char* const kShellEscapeCharacters = " ~`#$&*()\\|[]{};'\"<>?!"; +const char* const kDefaultAdditionalWordCharacters = ":@-./_~"; +const char* const kURLAdditionalWordCharacters = ":/-._~[]?#@!$&'()*+,;="; diff --git a/src/apps/terminal/TermConst.h b/src/apps/terminal/TermConst.h index 942d9215d8..9d1c942f15 100644 --- a/src/apps/terminal/TermConst.h +++ b/src/apps/terminal/TermConst.h @@ -145,6 +145,10 @@ static const char* const PREF_WINDOW_TITLE = "Window title"; extern const char* const kTooTipSetTabTitlePlaceholders; extern const char* const kTooTipSetWindowTitlePlaceholders; +extern const char* const kShellEscapeCharacters; +extern const char* const kDefaultAdditionalWordCharacters; +extern const char* const kURLAdditionalWordCharacters; + // Cursor style enum { diff --git a/src/apps/terminal/TermView.cpp b/src/apps/terminal/TermView.cpp index b448017c37..16590e5fd7 100644 --- a/src/apps/terminal/TermView.cpp +++ b/src/apps/terminal/TermView.cpp @@ -16,7 +16,6 @@ #include "TermView.h" -#include #include #include #include @@ -102,9 +101,6 @@ static const bigtime_t kCursorBlinkInterval = 500000; static const rgb_color kBlackColor = { 0, 0, 0, 255 }; static const rgb_color kWhiteColor = { 255, 255, 255, 255 }; -static const char* kDefaultSpecialWordChars = ":@-./_~"; -static const char* kEscapeCharacters = " ~`#$&*()\\|[]{};'\"<>?!"; - // secondary mouse button drop const int32 kSecondaryMouseDropAction = 'SMDA'; @@ -125,40 +121,28 @@ restrict_value(const Type& value, const Type& min, const Type& max) } -// #pragma mark - CharClassifier +// #pragma mark - TextBufferSyncLocker -class TermView::CharClassifier : public TerminalCharClassifier { +class TermView::TextBufferSyncLocker { public: - CharClassifier(const char* specialWordChars) + TextBufferSyncLocker(TermView* view) + : + fView(view) { - const char* p = specialWordChars; - while (p != NULL && *p) { - int count = UTF8Char::ByteCount(*p); - if (count <= 0 || count > 4) - break; - fSpecialWordChars.push_back(UTF8Char(p, count)); - p += count; - } + fView->fTextBuffer->Lock(); } - virtual int Classify(const UTF8Char& character) + ~TextBufferSyncLocker() { - if (character.IsSpace()) - return CHAR_TYPE_SPACE; + fView->fTextBuffer->Unlock(); - if (character.IsAlNum()) - return CHAR_TYPE_WORD_CHAR; - - if (std::find(fSpecialWordChars.begin(), fSpecialWordChars.end(), - character) != fSpecialWordChars.end()) - return CHAR_TYPE_WORD_CHAR; - - return CHAR_TYPE_WORD_DELIMITER; + if (fView->fVisibleTextBufferChanged) + fView->_VisibleTextBufferChanged(); } private: - std::vector fSpecialWordChars; + TermView* fView; }; @@ -299,6 +283,7 @@ TermView::_InitObject(const ShellParameters& shellParameters) fCursor = TermPos(0, 0); fTextBuffer = NULL; fVisibleTextBuffer = NULL; + fVisibleTextBufferChanged = false; fScrollBar = NULL; fInline = NULL; fSelectForeColor = kWhiteColor; @@ -308,8 +293,8 @@ TermView::_InitObject(const ShellParameters& shellParameters) fScrolledSinceLastSync = 0; fSyncRunner = NULL; fConsiderClockedSync = false; - fSelStart = TermPos(-1, -1); - fSelEnd = TermPos(-1, -1); + fSelection.SetHighlighter(this); + fSelection.SetRange(TermPos(0, 0), TermPos(0, 0)); fPrevPos = TermPos(-1, - 1); fReportX10MouseEvent = false; fReportNormalMouseEvent = false; @@ -318,6 +303,8 @@ TermView::_InitObject(const ShellParameters& shellParameters) fMouseClipboard = be_clipboard; fDefaultState = new(std::nothrow) DefaultState(this); fSelectState = new(std::nothrow) SelectState(this); + fHyperLinkState = new(std::nothrow) HyperLinkState(this); + fHyperLinkMenuState = new(std::nothrow) HyperLinkMenuState(this); fActiveState = NULL; fTextBuffer = new(std::nothrow) TerminalBuffer; @@ -329,8 +316,8 @@ TermView::_InitObject(const ShellParameters& shellParameters) return B_NO_MEMORY; // TODO: Make the special word chars user-settable! - fCharClassifier = new(std::nothrow) CharClassifier( - kDefaultSpecialWordChars); + fCharClassifier = new(std::nothrow) DefaultCharClassifier( + kDefaultAdditionalWordCharacters); if (fCharClassifier == NULL) return B_NO_MEMORY; @@ -362,8 +349,12 @@ TermView::_InitObject(const ShellParameters& shellParameters) if (error < B_OK) return error; - if (fDefaultState == NULL || fSelectState == NULL) + fHighlights.AddItem(&fSelection); + + if (fDefaultState == NULL || fSelectState == NULL || fHyperLinkState == NULL + || fHyperLinkMenuState == NULL) { return B_NO_MEMORY; + } SetLowColor(fTextBackColor); SetViewColor(B_TRANSPARENT_32_BIT); @@ -383,6 +374,8 @@ TermView::~TermView() delete fDefaultState; delete fSelectState; + delete fHyperLinkState; + delete fHyperLinkMenuState; delete fSyncRunner; delete fAutoScrollRunner; delete fCharClassifier; @@ -457,6 +450,20 @@ TermView::Archive(BMessage* data, bool deep) const } +rgb_color +TermView::ForegroundColor() +{ + return fSelectForeColor; +} + + +rgb_color +TermView::BackgroundColor() +{ + return fSelectBackColor; +} + + inline int32 TermView::_LineAt(float y) { @@ -582,12 +589,13 @@ TermView::SetTermSize(int rows, int columns, bool notifyShell) // synchronize the visible text buffer { - BAutolock _(fTextBuffer); + TextBufferSyncLocker _(this); _SynchronizeWithTextBuffer(0, -1); int32 offset = _LineAt(0); fVisibleTextBuffer->SynchronizeWith(fTextBuffer, offset, offset, offset + rows + 2); + fVisibleTextBufferChanged = true; } if (notifyShell) @@ -784,7 +792,8 @@ TermView::Copy(BClipboard *clipboard) return; BString copyStr; - fTextBuffer->GetStringFromRegion(copyStr, fSelStart, fSelEnd); + fTextBuffer->GetStringFromRegion(copyStr, fSelection.Start(), + fSelection.End()); if (clipboard->Lock()) { BMessage *clipMsg = NULL; @@ -934,8 +943,11 @@ TermView::_Deactivate() //! Draw part of a line in the given view. void TermView::_DrawLinePart(int32 x1, int32 y1, uint32 attr, char *buf, - int32 width, bool mouse, bool cursor, BView *inView) + int32 width, Highlight* highlight, bool cursor, BView *inView) { + if (highlight != NULL) + attr = highlight->Highlighter()->AdjustTextAttributes(attr); + inView->SetFont(IS_BOLD(attr) && !fEmulateBold ? &fBoldFont : &fHalfFont); // Set pen point @@ -958,9 +970,9 @@ TermView::_DrawLinePart(int32 x1, int32 y1, uint32 attr, char *buf, if (cursor) { rgb_fore = fCursorForeColor; rgb_back = fCursorBackColor; - } else if (mouse) { - rgb_fore = fSelectForeColor; - rgb_back = fSelectBackColor; + } else if (highlight != NULL) { + rgb_fore = highlight->Highlighter()->ForegroundColor(); + rgb_back = highlight->Highlighter()->BackgroundColor(); } else { // Reverse attribute(If selected area, don't reverse color). if (IS_INVERSE(attr)) { @@ -1025,7 +1037,7 @@ TermView::_DrawCursor() } } - bool selected = _CheckSelectedRegion(TermPos(fCursor.x, fCursor.y)); + Highlight* highlight = _CheckHighlightRegion(TermPos(fCursor.x, fCursor.y)); if (fVisibleTextBuffer->GetChar(fCursor.y - firstVisible, fCursor.x, character, attr) == A_CHAR && (fCursorStyle == BLOCK_CURSOR || !cursorVisible)) { @@ -1037,11 +1049,11 @@ TermView::_DrawCursor() buffer[bytes] = '\0'; _DrawLinePart(fCursor.x * fFontWidth, (int32)rect.top, attr, buffer, - width, selected, cursorVisible, this); + width, highlight, cursorVisible, this); } else { - if (selected) - SetHighColor(fSelectBackColor); - else if (cursorVisible ) + if (highlight != NULL) + SetHighColor(highlight->Highlighter()->BackgroundColor()); + else if (cursorVisible) SetHighColor(fCursorBackColor ); else { uint32 count = 0; @@ -1144,6 +1156,7 @@ void TermView::AttachedToWindow() { fMouseButtons = 0; + fModifiers = modifiers(); // update the terminal size because it may have changed while the TermView // was detached from the window. On such conditions FrameResized was not @@ -1162,7 +1175,7 @@ TermView::AttachedToWindow() &message, 500000); { - BAutolock _(fTextBuffer); + TextBufferSyncLocker _(this); fTextBuffer->SetListener(thisMessenger); _SynchronizeWithTextBuffer(0, -1); } @@ -1240,15 +1253,15 @@ TermView::Draw(BRect updateRect) for (int32 i = k; i <= x2;) { int32 lastColumn = x2; - bool insideSelection = _CheckSelectedRegion(j, i, lastColumn); + Highlight* highlight = _CheckHighlightRegion(j, i, lastColumn); // This will clip lastColumn to the selection start or end // to ensure the selection is not drawn at the same time as // something else int32 count = fVisibleTextBuffer->GetString(j - firstVisible, i, lastColumn, buf, attr); -// debug_printf(" fVisibleTextBuffer->GetString(%ld, %ld, %ld) -> (%ld, \"%.*s\"), selected: %d\n", -// j - firstVisible, i, lastColumn, count, (int)count, buf, insideSelection); +// debug_printf(" fVisibleTextBuffer->GetString(%ld, %ld, %ld) -> (%ld, \"%.*s\"), highlight: %p\n", +// j - firstVisible, i, lastColumn, count, (int)count, buf, highlight); if (count == 0) { // No chars to draw : we just fill the rectangle with the @@ -1258,8 +1271,9 @@ TermView::Draw(BRect updateRect) fFontWidth * nextColumn - 1, 0); rect.bottom = rect.top + fFontHeight - 1; - rgb_color rgb_back = insideSelection - ? fSelectBackColor : fTextBackColor; + rgb_color rgb_back = highlight != NULL + ? highlight->Highlighter()->BackgroundColor() + : fTextBackColor; if (fTextBuffer->IsAlternateScreenActive()) { // alternate screen uses cell attributes @@ -1294,7 +1308,7 @@ TermView::Draw(BRect updateRect) count = FULL_WIDTH; _DrawLinePart(fFontWidth * i, (int32)_LineOffset(j), - attr, buf, count, insideSelection, false, this); + attr, buf, count, highlight, false, this); i += count; } } @@ -1365,6 +1379,15 @@ TermView::WindowActivated(bool active) if (fActive) _Deactivate(); } + + fActiveState->WindowActivated(active); + + if (active) { + int32 oldModifiers = fModifiers; + fModifiers = modifiers(); + if (fModifiers != oldModifiers) + fActiveState->ModifiersChanged(oldModifiers, fModifiers); + } } @@ -1576,6 +1599,15 @@ TermView::MessageReceived(BMessage *msg) break; } + case B_MODIFIERS_CHANGED: + { + int32 oldModifiers = fModifiers; + fModifiers = msg->GetInt32("modifiers", 0); + if (fModifiers != oldModifiers) + fActiveState->ModifiersChanged(oldModifiers, fModifiers); + break; + } + case B_INPUT_METHOD_EVENT: { int32 opcode; @@ -1677,7 +1709,7 @@ TermView::MessageReceived(BMessage *msg) break; case MSG_TERMINAL_BUFFER_CHANGED: { - BAutolock _(fTextBuffer); + TextBufferSyncLocker _(this); _SynchronizeWithTextBuffer(0, -1); break; } @@ -1842,7 +1874,7 @@ TermView::ScrollTo(BPoint where) //debug_printf("fVisibleTextBuffer->ScrollBy(%ld)\n", newFirstLine - oldFirstLine); fVisibleTextBuffer->ScrollBy(newFirstLine - oldFirstLine); } - BAutolock _(fTextBuffer); + TextBufferSyncLocker _(this); if (diff < 0) _SynchronizeWithTextBuffer(newFirstLine, oldFirstLine - 1); else @@ -2004,11 +2036,11 @@ TermView::_DoSecondaryMouseDropAction(BMessage* msg) int32 slash = string.FindLast("/"); string.Truncate(slash); } - string.CharacterEscape(kEscapeCharacters, '\\'); + string.CharacterEscape(kShellEscapeCharacters, '\\'); itemString += string; break; } - string.CharacterEscape(kEscapeCharacters, '\\'); + string.CharacterEscape(kShellEscapeCharacters, '\\'); itemString += string; } @@ -2035,7 +2067,7 @@ TermView::_DoFileDrop(entry_ref& ref) BPath path(&ent); BString string(path.Path()); - string.CharacterEscape(kEscapeCharacters, '\\'); + string.CharacterEscape(kShellEscapeCharacters, '\\'); _WritePTY(string.String(), string.Length()); } @@ -2099,7 +2131,9 @@ TermView::_SynchronizeWithTextBuffer(int32 visibleDirtyTop, // sync time not passed yet -- keep counting fScrolledSinceLastSync += linesScrolled; return; - } else if (fScrolledSinceLastSync + linesScrolled <= fRows) { + } + + if (fScrolledSinceLastSync + linesScrolled <= fRows) { // time's up, but not enough happened delete fSyncRunner; fSyncRunner = NULL; @@ -2111,6 +2145,8 @@ TermView::_SynchronizeWithTextBuffer(int32 visibleDirtyTop, fScrolledSinceLastSync = 0; } + fVisibleTextBufferChanged = true; + // Simple case first -- complete invalidation. if (info.invalidateAll) { Invalidate(); @@ -2194,15 +2230,23 @@ TermView::_SynchronizeWithTextBuffer(int32 visibleDirtyTop, fVisibleTextBuffer->ScrollBy(linesScrolled); } - // move selection - if (fSelStart != fSelEnd) { - fSelStart.y -= linesScrolled; - fSelEnd.y -= linesScrolled; - fInitialSelectionStart.y -= linesScrolled; - fInitialSelectionEnd.y -= linesScrolled; + // move highlights + for (int32 i = 0; Highlight* highlight = fHighlights.ItemAt(i); i++) { + if (highlight->IsEmpty()) + continue; - if (fSelStart.y < -historySize) - _Deselect(); + highlight->ScrollRange(linesScrolled); + if (highlight == &fSelection) { + fInitialSelectionStart.y -= linesScrolled; + fInitialSelectionEnd.y -= linesScrolled; + } + + if (highlight->Start().y < -historySize) { + if (highlight == &fSelection) + _Deselect(); + else + _ClearHighlight(highlight); + } } } @@ -2212,12 +2256,13 @@ TermView::_SynchronizeWithTextBuffer(int32 visibleDirtyTop, info.dirtyBottom); // clear the selection, if affected - if (fSelStart != fSelEnd) { + if (!fSelection.IsEmpty()) { // TODO: We're clearing the selection more often than necessary -- // to avoid that, we'd also need to track the x coordinates of the // dirty range. - int32 selectionBottom = fSelEnd.x > 0 ? fSelEnd.y : fSelEnd.y - 1; - if (fSelStart.y <= info.dirtyBottom + int32 selectionBottom = fSelection.End().x > 0 + ? fSelection.End().y : fSelection.End().y - 1; + if (fSelection.Start().y <= info.dirtyBottom && info.dirtyTop <= selectionBottom) { _Deselect(); } @@ -2247,6 +2292,17 @@ TermView::_SynchronizeWithTextBuffer(int32 visibleDirtyTop, } +void +TermView::_VisibleTextBufferChanged() +{ + if (!fVisibleTextBufferChanged) + return; + + fVisibleTextBufferChanged = false; + fActiveState->VisibleTextBufferChanged(); +} + + /*! Write strings to PTY device. If encoding system isn't UTF8, change encoding to UTF8 before writing PTY. */ @@ -2322,9 +2378,8 @@ TermView::MouseDown(BPoint where) BMessage* currentMessage = Window()->CurrentMessage(); int32 buttons = currentMessage->GetInt32("buttons", 0); - int32 modifiers = currentMessage->GetInt32("modifiers", 0); - fActiveState->MouseDown(where, buttons, modifiers); + fActiveState->MouseDown(where, buttons, fModifiers); fMouseButtons = buttons; fLastClickPoint = where; @@ -2334,7 +2389,7 @@ TermView::MouseDown(BPoint where) void TermView::MouseMoved(BPoint where, uint32 transit, const BMessage *message) { - fActiveState->MouseMoved(where, transit, message); + fActiveState->MouseMoved(where, transit, message, fModifiers); } @@ -2354,7 +2409,7 @@ void TermView::_Select(TermPos start, TermPos end, bool inclusive, bool setInitialSelection) { - BAutolock _(fTextBuffer); + TextBufferSyncLocker _(this); _SynchronizeWithTextBuffer(0, -1); @@ -2396,18 +2451,17 @@ TermView::_Select(TermPos start, TermPos end, bool inclusive, end.x = fColumns; } - if (fSelStart != fSelEnd) - _InvalidateTextRange(fSelStart, fSelEnd); + if (!fSelection.IsEmpty()) + _InvalidateTextRange(fSelection.Start(), fSelection.End()); - fSelStart = start; - fSelEnd = end; + fSelection.SetRange(start, end); if (setInitialSelection) { - fInitialSelectionStart = fSelStart; - fInitialSelectionEnd = fSelEnd; + fInitialSelectionStart = fSelection.Start(); + fInitialSelectionEnd = fSelection.End(); } - _InvalidateTextRange(fSelStart, fSelEnd); + _InvalidateTextRange(fSelection.Start(), fSelection.End()); } @@ -2419,8 +2473,8 @@ TermView::_ExtendSelection(TermPos pos, bool inclusive, if (!useInitialSelection && !_HasSelection()) return; - TermPos start = fSelStart; - TermPos end = fSelEnd; + TermPos start = fSelection.Start(); + TermPos end = fSelection.End(); if (useInitialSelection) { start = fInitialSelectionStart; @@ -2446,22 +2500,17 @@ void TermView::_Deselect() { //debug_printf("TermView::_Deselect(): has selection: %d\n", _HasSelection()); - if (!_HasSelection()) - return; - - _InvalidateTextRange(fSelStart, fSelEnd); - - fSelStart.SetTo(0, 0); - fSelEnd.SetTo(0, 0); - fInitialSelectionStart.SetTo(0, 0); - fInitialSelectionEnd.SetTo(0, 0); + if (_ClearHighlight(&fSelection)) { + fInitialSelectionStart.SetTo(0, 0); + fInitialSelectionEnd.SetTo(0, 0); + } } bool TermView::_HasSelection() const { - return fSelStart != fSelEnd; + return !fSelection.IsEmpty(); } @@ -2476,11 +2525,15 @@ TermView::_SelectWord(BPoint where, bool extend, bool useInitialSelection) return; if (extend) { - if (start < (useInitialSelection ? fInitialSelectionStart : fSelStart)) + if (start + < (useInitialSelection + ? fInitialSelectionStart : fSelection.Start())) { _ExtendSelection(start, false, useInitialSelection); - else if (end > (useInitialSelection ? fInitialSelectionEnd : fSelEnd)) + } else if (end + > (useInitialSelection + ? fInitialSelectionEnd : fSelection.End())) { _ExtendSelection(end, false, useInitialSelection); - else if (useInitialSelection) + } else if (useInitialSelection) _Select(start, end, false, false); } else _Select(start, end, false, !useInitialSelection); @@ -2494,47 +2547,101 @@ TermView::_SelectLine(BPoint where, bool extend, bool useInitialSelection) TermPos end = TermPos(0, start.y + 1); if (extend) { - if (start < (useInitialSelection ? fInitialSelectionStart : fSelStart)) + if (start + < (useInitialSelection + ? fInitialSelectionStart : fSelection.Start())) { _ExtendSelection(start, false, useInitialSelection); - else if (end > (useInitialSelection ? fInitialSelectionEnd : fSelEnd)) + } else if (end + > (useInitialSelection + ? fInitialSelectionEnd : fSelection.End())) { _ExtendSelection(end, false, useInitialSelection); - else if (useInitialSelection) + } else if (useInitialSelection) _Select(start, end, false, false); } else _Select(start, end, false, !useInitialSelection); } -bool -TermView::_CheckSelectedRegion(const TermPos &pos) const +void +TermView::_AddHighlight(Highlight* highlight) { - return pos >= fSelStart && pos < fSelEnd; + fHighlights.AddItem(highlight); + + if (!highlight->IsEmpty()) + _InvalidateTextRange(highlight->Start(), highlight->End()); +} + + +void +TermView::_RemoveHighlight(Highlight* highlight) +{ + fHighlights.RemoveItem(highlight); + + if (!highlight->IsEmpty()) + _InvalidateTextRange(highlight->Start(), highlight->End()); } bool -TermView::_CheckSelectedRegion(int32 row, int32 firstColumn, +TermView::_ClearHighlight(Highlight* highlight) +{ + if (highlight->IsEmpty()) + return false; + + _InvalidateTextRange(highlight->Start(), highlight->End()); + + highlight->SetRange(TermPos(0, 0), TermPos(0, 0)); + return true; +} + + +TermView::Highlight* +TermView::_CheckHighlightRegion(const TermPos &pos) const +{ + for (int32 i = 0; Highlight* highlight = fHighlights.ItemAt(i); i++) { + if (highlight->RangeContains(pos)) + return highlight; + } + + return NULL; +} + + +TermView::Highlight* +TermView::_CheckHighlightRegion(int32 row, int32 firstColumn, int32& lastColumn) const { - if (fSelStart == fSelEnd) - return false; + Highlight* nextHighlight = NULL; - if (row == fSelStart.y && firstColumn < fSelStart.x - && lastColumn >= fSelStart.x) { - // region starts before the selection, but intersects with it - lastColumn = fSelStart.x - 1; - return false; + for (int32 i = 0; Highlight* highlight = fHighlights.ItemAt(i); i++) { + if (highlight->IsEmpty()) + continue; + + if (row == highlight->Start().y && firstColumn < highlight->Start().x + && lastColumn >= highlight->Start().x) { + // region starts before the highlight, but intersects with it + if (nextHighlight == NULL + || highlight->Start().x < nextHighlight->Start().x) { + nextHighlight = highlight; + } + continue; + } + + if (row == highlight->End().y && firstColumn < highlight->End().x + && lastColumn >= highlight->End().x) { + // region starts in the highlight, but exceeds the end + lastColumn = highlight->End().x - 1; + return highlight; + } + + TermPos pos(firstColumn, row); + if (highlight->RangeContains(pos)) + return highlight; } - if (row == fSelEnd.y && firstColumn < fSelEnd.x - && lastColumn >= fSelEnd.x) { - // region starts in the selection, but exceeds the end - lastColumn = fSelEnd.x - 1; - return true; - } - - TermPos pos(firstColumn, row); - return pos >= fSelStart && pos < fSelEnd; + if (nextHighlight != NULL) + lastColumn = nextHighlight->Start().x - 1; + return NULL; } @@ -2560,15 +2667,15 @@ bool TermView::Find(const BString &str, bool forwardSearch, bool matchCase, bool matchWord) { - BAutolock _(fTextBuffer); + TextBufferSyncLocker _(this); _SynchronizeWithTextBuffer(0, -1); TermPos start; if (_HasSelection()) { if (forwardSearch) - start = fSelEnd; + start = fSelection.End(); else - start = fSelStart; + start = fSelection.Start(); } else { // search from the very beginning/end if (forwardSearch) @@ -2584,7 +2691,7 @@ TermView::Find(const BString &str, bool forwardSearch, bool matchCase, } _Select(matchStart, matchEnd, false, true); - _ScrollToRange(fSelStart, fSelEnd); + _ScrollToRange(fSelection.Start(), fSelection.End()); return true; } @@ -2596,7 +2703,7 @@ TermView::GetSelection(BString &str) { str.SetTo(""); BAutolock _(fTextBuffer); - fTextBuffer->GetStringFromRegion(str, fSelStart, fSelEnd); + fTextBuffer->GetStringFromRegion(str, fSelection.Start(), fSelection.End()); } @@ -2619,17 +2726,18 @@ TermView::InitiateDrag() BAutolock _(fTextBuffer); BString copyStr(""); - fTextBuffer->GetStringFromRegion(copyStr, fSelStart, fSelEnd); + fTextBuffer->GetStringFromRegion(copyStr, fSelection.Start(), + fSelection.End()); BMessage message(B_MIME_DATA); message.AddData("text/plain", B_MIME_TYPE, copyStr.String(), copyStr.Length()); - BPoint start = _ConvertFromTerminal(fSelStart); - BPoint end = _ConvertFromTerminal(fSelEnd); + BPoint start = _ConvertFromTerminal(fSelection.Start()); + BPoint end = _ConvertFromTerminal(fSelection.End()); BRect rect; - if (fSelStart.y == fSelEnd.y) + if (fSelection.Start().y == fSelection.End().y) rect.Set(start.x, start.y, end.x + fFontWidth, end.y + fFontHeight); else rect.Set(0, start.y, fColumns * fFontWidth, end.y + fFontHeight); @@ -2911,6 +3019,9 @@ TermView::Listener::NextTermView(TermView* view) } +// #pragma mark - + + #ifdef USE_DEBUG_SNAPSHOTS void diff --git a/src/apps/terminal/TermView.h b/src/apps/terminal/TermView.h index 429097db82..5fc9c34482 100644 --- a/src/apps/terminal/TermView.h +++ b/src/apps/terminal/TermView.h @@ -16,10 +16,12 @@ #include #include +#include #include #include #include "TermPos.h" +#include "TermViewHighlight.h" class ActiveProcessInfo; @@ -30,6 +32,7 @@ class BScrollView; class BString; class BStringView; class BasicTerminalBuffer; +class DefaultCharClassifier; class InlineInput; class ResizeWindow; class ShellInfo; @@ -38,10 +41,14 @@ class TermBuffer; class TerminalBuffer; class Shell; -class TermView : public BView { + +class TermView : public BView, private TermViewHighlighter { public: class Listener; + typedef TermViewHighlighter Highlighter; + typedef TermViewHighlight Highlight; + public: TermView(BRect frame, const ShellParameters& shellParameters, @@ -141,17 +148,29 @@ protected: const char* property); private: - class CharClassifier; + class TextBufferSyncLocker; + friend class TextBufferSyncLocker; class State; class StandardBaseState; class DefaultState; class SelectState; + class HyperLinkState; + class HyperLinkMenuState; friend class State; friend class StandardBaseState; friend class DefaultState; friend class SelectState; + friend class HyperLinkState; + friend class HyperLinkMenuState; + + typedef BObjectList HighlightList; + +private: + // TermViewHighlighter + virtual rgb_color ForegroundColor(); + virtual rgb_color BackgroundColor(); private: // point and text offset conversion @@ -174,8 +193,9 @@ private: void _SwitchCursorBlinking(bool blinkingOn); void _DrawLinePart(int32 x1, int32 y1, uint32 attr, - char* buffer, int32 width, bool mouse, - bool cursor, BView* inView); + char* buffer, int32 width, + Highlight* highlight, bool cursor, + BView* inView); void _DrawCursor(); void _InvalidateTextRange(TermPos start, TermPos end); @@ -193,6 +213,7 @@ private: void _SynchronizeWithTextBuffer( int32 visibleDirtyTop, int32 visibleDirtyBottom); + void _VisibleTextBufferChanged(); void _WritePTY(const char* text, int32 numBytes); @@ -209,8 +230,12 @@ private: void _SelectLine(BPoint where, bool extend, bool useInitialSelection); - bool _CheckSelectedRegion(const TermPos& pos) const; - bool _CheckSelectedRegion(int32 row, + void _AddHighlight(Highlight* highlight); + void _RemoveHighlight(Highlight* highlight); + bool _ClearHighlight(Highlight* highlight); + + Highlight* _CheckHighlightRegion(const TermPos& pos) const; + Highlight* _CheckHighlightRegion(int32 row, int32 firstColumn, int32& lastColumn) const; void _UpdateSIGWINCH(); @@ -237,7 +262,7 @@ private: BMessageRunner* fAutoScrollRunner; BMessageRunner* fResizeRunner; BStringView* fResizeView; - CharClassifier* fCharClassifier; + DefaultCharClassifier* fCharClassifier; // Font and Width BFont fHalfFont; @@ -272,6 +297,7 @@ private: // Object pointer. TerminalBuffer* fTextBuffer; BasicTerminalBuffer* fVisibleTextBuffer; + bool fVisibleTextBufferChanged; BScrollBar* fScrollBar; InlineInput* fInline; @@ -297,14 +323,16 @@ private: bool fConsiderClockedSync; // selection - TermPos fSelStart; - TermPos fSelEnd; + Highlight fSelection; TermPos fInitialSelectionStart; TermPos fInitialSelectionEnd; BPoint fLastClickPoint; + HighlightList fHighlights; + // mouse int32 fMouseButtons; + int32 fModifiers; TermPos fPrevPos; bool fReportX10MouseEvent; bool fReportNormalMouseEvent; @@ -315,6 +343,8 @@ private: // states DefaultState* fDefaultState; SelectState* fSelectState; + HyperLinkState* fHyperLinkState; + HyperLinkMenuState* fHyperLinkMenuState; State* fActiveState; }; diff --git a/src/apps/terminal/TermViewHighlight.cpp b/src/apps/terminal/TermViewHighlight.cpp new file mode 100644 index 0000000000..b14f3c9e6f --- /dev/null +++ b/src/apps/terminal/TermViewHighlight.cpp @@ -0,0 +1,19 @@ +/* + * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include "TermViewHighlight.h" + + +TermViewHighlighter::~TermViewHighlighter() +{ +} + + +uint32 +TermViewHighlighter::AdjustTextAttributes(uint32 attributes) +{ + return attributes; +} diff --git a/src/apps/terminal/TermViewHighlight.h b/src/apps/terminal/TermViewHighlight.h new file mode 100644 index 0000000000..1e9e5736bd --- /dev/null +++ b/src/apps/terminal/TermViewHighlight.h @@ -0,0 +1,83 @@ +/* + * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef TERMVIEW_HIGHLIGHT_H +#define TERMVIEW_HIGHLIGHT_H + + +#include + +#include "TermPos.h" + + +class TermViewHighlighter { +public: + virtual ~TermViewHighlighter(); + + virtual rgb_color ForegroundColor() = 0; + virtual rgb_color BackgroundColor() = 0; + virtual uint32 AdjustTextAttributes(uint32 attributes); +}; + + +class TermViewHighlight { +public: + TermViewHighlight() + : + fHighlighter(NULL), + fStart(-1, -1), + fEnd(-1, -1) + { + } + + TermViewHighlighter* Highlighter() const + { + return fHighlighter; + } + + void SetHighlighter(TermViewHighlighter* highligher) + { + fHighlighter = highligher; + } + + const TermPos& Start() const + { + return fStart; + } + + const TermPos& End() const + { + return fEnd; + } + + bool IsEmpty() const + { + return fStart == fEnd; + } + + bool RangeContains(const TermPos& pos) const + { + return pos >= fStart && pos < fEnd; + } + + void SetRange(const TermPos& start, const TermPos& end) + { + fStart = start; + fEnd = end; + } + + void ScrollRange(int32 byLines) + { + fStart.y -= byLines; + fEnd.y -= byLines; + } + +private: + TermViewHighlighter* fHighlighter; + TermPos fStart; + TermPos fEnd; +}; + + +#endif // TERMVIEW_HIGHLIGHT_H diff --git a/src/apps/terminal/TermViewStates.cpp b/src/apps/terminal/TermViewStates.cpp index e74194dc18..8a85173bc5 100644 --- a/src/apps/terminal/TermViewStates.cpp +++ b/src/apps/terminal/TermViewStates.cpp @@ -16,17 +16,30 @@ #include "TermViewStates.h" +#include +#include + +#include +#include +#include +#include #include +#include #include #include #include #include "Shell.h" #include "TermConst.h" +#include "TerminalBuffer.h" #include "VTkeymap.h" #include "VTKeyTbl.h" +#undef B_TRANSLATION_CONTEXT +#define B_TRANSLATION_CONTEXT "Terminal TermView" + + // selection granularity enum { SELECT_CHARS, @@ -36,6 +49,13 @@ enum { static const uint32 kAutoScroll = 'AScr'; +static const uint32 kMessageOpenLink = 'OLnk'; +static const uint32 kMessageCopyLink = 'CLnk'; +static const uint32 kMessageMenuClosed = 'MClo'; + + +static const char* const kKnownURLProtocols = "http:https:ftp:mailto"; + // #pragma mark - State @@ -71,6 +91,12 @@ TermView::State::MessageReceived(BMessage* message) } +void +TermView::State::ModifiersChanged(int32 oldModifiers, int32 modifiers) +{ +} + + void TermView::State::KeyDown(const char* bytes, int32 numBytes) { @@ -85,7 +111,7 @@ TermView::State::MouseDown(BPoint where, int32 buttons, int32 modifiers) void TermView::State::MouseMoved(BPoint where, uint32 transit, - const BMessage* message) + const BMessage* message, int32 modifiers) { } @@ -96,6 +122,18 @@ TermView::State::MouseUp(BPoint where, int32 buttons) } +void +TermView::State::WindowActivated(bool active) +{ +} + + +void +TermView::State::VisibleTextBufferChanged() +{ +} + + // #pragma mark - StandardBaseState @@ -107,25 +145,22 @@ TermView::StandardBaseState::StandardBaseState(TermView* view) bool -TermView::StandardBaseState::_StandardMouseMoved(BPoint where) +TermView::StandardBaseState::_StandardMouseMoved(BPoint where, int32 modifiers) { if (!fView->fReportAnyMouseEvent && !fView->fReportButtonMouseEvent) return false; - int32 modifier; - fView->Window()->CurrentMessage()->FindInt32("modifiers", &modifier); - TermPos clickPos = fView->_ConvertToTerminal(where); if (fView->fReportButtonMouseEvent) { if (fView->fPrevPos.x != clickPos.x || fView->fPrevPos.y != clickPos.y) { - fView->_SendMouseEvent(fView->fMouseButtons, modifier, + fView->_SendMouseEvent(fView->fMouseButtons, modifiers, clickPos.x, clickPos.y, true); } fView->fPrevPos = clickPos; } else { - fView->_SendMouseEvent(fView->fMouseButtons, modifier, clickPos.x, + fView->_SendMouseEvent(fView->fMouseButtons, modifiers, clickPos.x, clickPos.y, true); } @@ -143,6 +178,13 @@ TermView::DefaultState::DefaultState(TermView* view) } +void +TermView::DefaultState::ModifiersChanged(int32 oldModifiers, int32 modifiers) +{ + _CheckEnterHyperLinkState(modifiers); +} + + void TermView::DefaultState::KeyDown(const char* bytes, int32 numBytes) { @@ -341,9 +383,32 @@ TermView::DefaultState::MouseDown(BPoint where, int32 buttons, int32 modifiers) void TermView::DefaultState::MouseMoved(BPoint where, uint32 transit, - const BMessage* message) + const BMessage* message, int32 modifiers) { - _StandardMouseMoved(where); + if (_CheckEnterHyperLinkState(modifiers)) + return; + + _StandardMouseMoved(where, modifiers); +} + + +void +TermView::DefaultState::WindowActivated(bool active) +{ + if (active) + _CheckEnterHyperLinkState(fView->fModifiers); +} + + +bool +TermView::DefaultState::_CheckEnterHyperLinkState(int32 modifiers) +{ + if ((modifiers & B_COMMAND_KEY) != 0 && fView->Window()->IsActive()) { + fView->_NextState(fView->fHyperLinkState); + return true; + } + + return false; } @@ -368,7 +433,7 @@ TermView::SelectState::Prepare(BPoint where, int32 modifiers) if (fView->_HasSelection()) { TermPos inPos = fView->_ConvertToTerminal(where); - if (fView->_CheckSelectedRegion(inPos)) { + if (fView->fSelection.RangeContains(inPos)) { if (modifiers & B_CONTROL_KEY) { BPoint p; uint32 bt; @@ -448,9 +513,9 @@ TermView::SelectState::MessageReceived(BMessage* message) void TermView::SelectState::MouseMoved(BPoint where, uint32 transit, - const BMessage* message) + const BMessage* message, int32 modifiers) { - if (_StandardMouseMoved(where)) + if (_StandardMouseMoved(where, modifiers)) return; if (fCheckMouseTracking) { @@ -561,3 +626,376 @@ TermView::SelectState::_AutoScrollUpdate() } } } + + +// #pragma mark - HyperLinkState + + +TermView::HyperLinkState::HyperLinkState(TermView* view) + : + State(view), + fURLCharClassifier(kURLAdditionalWordCharacters), + fPathComponentCharClassifier( + BString(kDefaultAdditionalWordCharacters).RemoveFirst("/")), + fHighlight(), + fHighlightActive(false) +{ + fHighlight.SetHighlighter(this); +} + + +void +TermView::HyperLinkState::Entered() +{ + _UpdateHighlight(); +} + + +void +TermView::HyperLinkState::Exited() +{ + _DeactivateHighlight(); +} + + +void +TermView::HyperLinkState::ModifiersChanged(int32 oldModifiers, int32 modifiers) +{ + if ((modifiers & B_COMMAND_KEY) == 0) + fView->_NextState(fView->fDefaultState); + else + _UpdateHighlight(); +} + + +void +TermView::HyperLinkState::MouseDown(BPoint where, int32 buttons, + int32 modifiers) +{ + TermPos start; + TermPos end; + HyperLink link; + bool pathPrefixOnly = (modifiers & B_SHIFT_KEY) != 0; + if (!_GetHyperLinkAt(where, pathPrefixOnly, link, start, end)) + return; + + if ((buttons & B_PRIMARY_MOUSE_BUTTON) != 0) { + link.Open(); + } else if ((buttons & B_SECONDARY_MOUSE_BUTTON) != 0) { + fView->fHyperLinkMenuState->Prepare(where, link); + fView->_NextState(fView->fHyperLinkMenuState); + } +} + + +void +TermView::HyperLinkState::MouseMoved(BPoint where, uint32 transit, + const BMessage* message, int32 modifiers) +{ + _UpdateHighlight(where, modifiers); +} + + +void +TermView::HyperLinkState::WindowActivated(bool active) +{ + if (!active) + fView->_NextState(fView->fDefaultState); +} + + +void +TermView::HyperLinkState::VisibleTextBufferChanged() +{ + _UpdateHighlight(); +} + + +rgb_color +TermView::HyperLinkState::ForegroundColor() +{ + return make_color(0, 0, 255); +} + + +rgb_color +TermView::HyperLinkState::BackgroundColor() +{ + return fView->fTextBackColor; +} + + +uint32 +TermView::HyperLinkState::AdjustTextAttributes(uint32 attributes) +{ + return attributes | UNDERLINE; +} + + +bool +TermView::HyperLinkState::_GetHyperLinkAt(BPoint where, bool pathPrefixOnly, + HyperLink& _link, TermPos& _start, TermPos& _end) +{ + TerminalBuffer* textBuffer = fView->fTextBuffer; + BAutolock textBufferLocker(textBuffer); + + TermPos pos = fView->_ConvertToTerminal(where); + + // try to get a URL first + BString text; + if (!textBuffer->FindWord(pos, &fURLCharClassifier, false, _start, _end)) + return false; + + text.Truncate(0); + textBuffer->GetStringFromRegion(text, _start, _end); + text.Trim(); + + // We're only happy, if it has a protocol part which we know. + int32 colonIndex = text.FindFirst(':'); + if (colonIndex >= 0) { + BString protocol(text, colonIndex); + if (strstr(kKnownURLProtocols, protocol) != NULL) { + _link = HyperLink(text, HyperLink::TYPE_URL); + return true; + } + } + + // no obvious URL -- try file name + if (!textBuffer->FindWord(pos, fView->fCharClassifier, false, _start, _end)) + return false; + + // In path-prefix-only mode we determine the end position anew by omitting + // the '/' in the allowed word chars. + if (pathPrefixOnly) { + TermPos componentStart; + TermPos componentEnd; + if (textBuffer->FindWord(pos, &fPathComponentCharClassifier, false, + componentStart, componentEnd)) { + _end = componentEnd; + } else { + // That means pos points to a '/'. We simply use the previous + // position. + _end = pos; + if (_start == _end) { + // Well, must be just "/". Advance to the next position. + if (!textBuffer->NextLinePos(_end, false)) + return false; + } + } + } + + text.Truncate(0); + textBuffer->GetStringFromRegion(text, _start, _end); + text.Trim(); + if (text.IsEmpty()) + return false; + + // check, whether the file exists + struct stat st; + if (lstat(text, &st) == 0) { + _link = HyperLink(text, HyperLink::TYPE_PATH); + return true; + } + + // As such this isn't an existing path. Try a few common alternative cases: + // * ":" + // * ":" + // * "::" + // * "::" + // * ":::" + + if (text.Length() <= 1) + return false; + + if (text[text.Length() - 1] == ':') { + text.Truncate(text.Length() - 1); + if (!textBuffer->PreviousLinePos(_end)) + return false; + + if (lstat(text, &st) == 0) { + _link = HyperLink(text, HyperLink::TYPE_PATH); + return true; + } + } + + BString path = text; + + for (int32 i = 0; i < 2; i++) { + int32 colonIndex = path.FindLast(':'); + if (colonIndex <= 0 || colonIndex == path.Length() - 1) + return false; + + char* numberEnd; + strtol(path.String() + colonIndex + 1, &numberEnd, 0); + if (*numberEnd != '\0') + return false; + + path.Truncate(colonIndex); + if (lstat(path, &st) == 0) { + _link = HyperLink(text, + i == 0 + ? HyperLink::TYPE_PATH_WITH_LINE + : HyperLink::TYPE_PATH_WITH_LINE_AND_COLUMN, + path); + return true; + } + } + + return false; +} + + +void +TermView::HyperLinkState::_UpdateHighlight() +{ + BPoint where; + uint32 buttons; + fView->GetMouse(&where, &buttons, false); + _UpdateHighlight(where, fView->fModifiers); +} + +void +TermView::HyperLinkState::_UpdateHighlight(BPoint where, int32 modifiers) +{ + TermPos start; + TermPos end; + HyperLink link; + bool pathPrefixOnly = (modifiers & B_SHIFT_KEY) != 0; + if (_GetHyperLinkAt(where, pathPrefixOnly, link, start, end)) + _ActivateHighlight(start, end); + else + _DeactivateHighlight(); +} + + +void +TermView::HyperLinkState::_ActivateHighlight(const TermPos& start, + const TermPos& end) +{ + if (fHighlightActive) { + if (fHighlight.Start() == start && fHighlight.End() == end) + return; + _DeactivateHighlight(); + } + + fHighlight.SetRange(start, end); + fView->_AddHighlight(&fHighlight); + BCursor cursor(B_CURSOR_ID_FOLLOW_LINK); + fView->SetViewCursor(&cursor); + fHighlightActive = true; +} + + +void +TermView::HyperLinkState::_DeactivateHighlight() +{ + if (fHighlightActive) { + fView->_RemoveHighlight(&fHighlight); + BCursor cursor(B_CURSOR_ID_SYSTEM_DEFAULT); + fView->SetViewCursor(&cursor); + fHighlightActive = false; + } +} + + +// #pragma mark - HyperLinkMenuState + + +class TermView::HyperLinkMenuState::PopUpMenu : public BPopUpMenu { +public: + PopUpMenu(const BMessenger& messageTarget) + : + BPopUpMenu("open hyperlink"), + fMessageTarget(messageTarget) + { + SetAsyncAutoDestruct(true); + } + + ~PopUpMenu() + { + fMessageTarget.SendMessage(kMessageMenuClosed); + } + +private: + BMessenger fMessageTarget; +}; + + +TermView::HyperLinkMenuState::HyperLinkMenuState(TermView* view) + : + State(view), + fLink() +{ +} + + +void +TermView::HyperLinkMenuState::Prepare(BPoint point, const HyperLink& link) +{ + fLink = link; + + // open context menu + PopUpMenu* menu = new PopUpMenu(fView); + BLayoutBuilder::Menu<> menuBuilder(menu); + switch (link.GetType()) { + case HyperLink::TYPE_URL: + menuBuilder + .AddItem(B_TRANSLATE("Open link"), kMessageOpenLink) + .AddItem(B_TRANSLATE("Copy link location"), kMessageCopyLink); + break; + + case HyperLink::TYPE_PATH: + case HyperLink::TYPE_PATH_WITH_LINE: + case HyperLink::TYPE_PATH_WITH_LINE_AND_COLUMN: + menuBuilder + .AddItem(B_TRANSLATE("Open path"), kMessageOpenLink) + .AddItem(B_TRANSLATE("Copy path"), kMessageCopyLink); + break; + } + menu->SetTargetForItems(fView); + menu->Go(fView->ConvertToScreen(point), true, true, true); +} + + +void +TermView::HyperLinkMenuState::Exited() +{ + fLink = HyperLink(); +} + + +bool +TermView::HyperLinkMenuState::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kMessageOpenLink: + if (fLink.IsValid()) + fLink.Open(); + return true; + + case kMessageCopyLink: + if (fLink.IsValid()) { + if (!be_clipboard->Lock()) + return true; + + be_clipboard->Clear(); + + if (BMessage *data = be_clipboard->Data()) { + data->AddData("text/plain", B_MIME_TYPE, + fLink.Address().String(), + fLink.Address().Length()); + be_clipboard->Commit(); + } + + be_clipboard->Unlock(); + } + return true; + + case kMessageMenuClosed: + fView->_NextState(fView->fDefaultState); + return true; + } + + return false; +} + diff --git a/src/apps/terminal/TermViewStates.h b/src/apps/terminal/TermViewStates.h index 26ff862069..af8e2955a8 100644 --- a/src/apps/terminal/TermViewStates.h +++ b/src/apps/terminal/TermViewStates.h @@ -14,6 +14,8 @@ #define TERMVIEW_STATES_H +#include "HyperLink.h" +#include "TerminalCharClassifier.h" #include "TermView.h" @@ -28,14 +30,20 @@ public: virtual bool MessageReceived(BMessage* message); // returns true, if handled + virtual void ModifiersChanged(int32 oldModifiers, + int32 modifiers); virtual void KeyDown(const char* bytes, int32 numBytes); virtual void MouseDown(BPoint where, int32 buttons, int32 modifiers); virtual void MouseMoved(BPoint where, uint32 transit, - const BMessage* message); + const BMessage* message, int32 modifiers); virtual void MouseUp(BPoint where, int32 buttons); + virtual void WindowActivated(bool active); + + virtual void VisibleTextBufferChanged(); + protected: TermView* fView; }; @@ -46,7 +54,8 @@ public: StandardBaseState(TermView* view); protected: - bool _StandardMouseMoved(BPoint where); + bool _StandardMouseMoved(BPoint where, + int32 modifiers); }; @@ -54,12 +63,20 @@ class TermView::DefaultState : public TermView::StandardBaseState { public: DefaultState(TermView* view); + virtual void ModifiersChanged(int32 oldModifiers, + int32 modifiers); + virtual void KeyDown(const char* bytes, int32 numBytes); virtual void MouseDown(BPoint where, int32 buttons, int32 modifiers); virtual void MouseMoved(BPoint where, uint32 transit, - const BMessage* message); + const BMessage* message, int32 modifiers); + + virtual void WindowActivated(bool active); + +private: + bool _CheckEnterHyperLinkState(int32 modifiers); }; @@ -72,7 +89,7 @@ public: virtual bool MessageReceived(BMessage* message); virtual void MouseMoved(BPoint where, uint32 transit, - const BMessage* message); + const BMessage* message, int32 modifiers); virtual void MouseUp(BPoint where, int32 buttons); private: @@ -85,4 +102,67 @@ private: }; +class TermView::HyperLinkState : public TermView::State, + private TermViewHighlighter { +public: + HyperLinkState(TermView* view); + + virtual void Entered(); + virtual void Exited(); + + virtual void ModifiersChanged(int32 oldModifiers, + int32 modifiers); + + virtual void MouseDown(BPoint where, int32 buttons, + int32 modifiers); + virtual void MouseMoved(BPoint where, uint32 transit, + const BMessage* message, int32 modifiers); + + virtual void WindowActivated(bool active); + + virtual void VisibleTextBufferChanged(); + +private: + // TermViewHighlighter + virtual rgb_color ForegroundColor(); + virtual rgb_color BackgroundColor(); + virtual uint32 AdjustTextAttributes(uint32 attributes); + +private: + bool _GetHyperLinkAt(BPoint where, + bool pathPrefixOnly, HyperLink& _link, + TermPos& _start, TermPos& _end); + + void _UpdateHighlight(); + void _UpdateHighlight(BPoint where, int32 modifiers); + void _ActivateHighlight(const TermPos& start, + const TermPos& end); + void _DeactivateHighlight(); + +private: + DefaultCharClassifier fURLCharClassifier; + DefaultCharClassifier fPathComponentCharClassifier; + TermViewHighlight fHighlight; + bool fHighlightActive; +}; + + +class TermView::HyperLinkMenuState : public TermView::State { +public: + HyperLinkMenuState(TermView* view); + + void Prepare(BPoint point, const HyperLink& link); + + virtual void Exited(); + + virtual bool MessageReceived(BMessage* message); + +private: + class PopUpMenu; + +private: + HyperLink fLink; +}; + + #endif // TERMVIEW_STATES_H diff --git a/src/apps/terminal/TerminalCharClassifier.cpp b/src/apps/terminal/TerminalCharClassifier.cpp index acdd2f59fb..86a3c9c606 100644 --- a/src/apps/terminal/TerminalCharClassifier.cpp +++ b/src/apps/terminal/TerminalCharClassifier.cpp @@ -1,11 +1,52 @@ /* - * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2008-2013, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #include "TerminalCharClassifier.h" +#include + +#include + + +// #pragma mark - TerminalCharClassifier + TerminalCharClassifier::~TerminalCharClassifier() { } + + +// #pragma mark - DefaultCharClassifier + + +DefaultCharClassifier::DefaultCharClassifier(const char* additionalWordChars) +{ + const char* p = additionalWordChars; + while (p != NULL && *p != '\0') { + int count = UTF8Char::ByteCount(*p); + if (count <= 0 || count > 4) + break; + fAdditionalWordChars.push_back(UTF8Char(p, count)); + p += count; + } +} + + +int +DefaultCharClassifier::Classify(const UTF8Char& character) +{ + if (character.IsSpace()) + return CHAR_TYPE_SPACE; + + if (character.IsAlNum()) + return CHAR_TYPE_WORD_CHAR; + + if (std::find(fAdditionalWordChars.begin(), fAdditionalWordChars.end(), + character) != fAdditionalWordChars.end()) { + return CHAR_TYPE_WORD_CHAR; + } + + return CHAR_TYPE_WORD_DELIMITER; +} diff --git a/src/apps/terminal/TerminalCharClassifier.h b/src/apps/terminal/TerminalCharClassifier.h index 236f31c3aa..de0d36411f 100644 --- a/src/apps/terminal/TerminalCharClassifier.h +++ b/src/apps/terminal/TerminalCharClassifier.h @@ -1,11 +1,16 @@ /* - * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2008-2013, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #ifndef TERMINAL_CHAR_CLASSIFIER_H #define TERMINAL_CHAR_CLASSIFIER_H +#include + +#include "UTF8Char.h" + + enum { CHAR_TYPE_SPACE, CHAR_TYPE_WORD_CHAR, @@ -23,4 +28,16 @@ public: }; +class DefaultCharClassifier: public TerminalCharClassifier { +public: + DefaultCharClassifier( + const char* additionalWordChars); + + virtual int Classify(const UTF8Char& character); + +private: + std::vector fAdditionalWordChars; +}; + + #endif // TERMINAL_CHAR_CLASSIFIER_H From 7e3f7da70a128469667d9c63d9262c723122c127 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 11 May 2013 01:35:17 +0200 Subject: [PATCH 125/136] BURL: Make the output to stderr DEBUG only --- src/kits/support/Url.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/kits/support/Url.cpp b/src/kits/support/Url.cpp index eb54f8900a..dd59207b99 100644 --- a/src/kits/support/Url.cpp +++ b/src/kits/support/Url.cpp @@ -77,7 +77,9 @@ BUrl::OpenWithPreferredApplication(bool onProblemAskUser) const // TODO: BAlert // if (onProblemAskUser) // BAlert ... Too long URL! +#if DEBUG fprintf(stderr, "URL too long"); +#endif return B_NAME_TOO_LONG; } @@ -96,7 +98,9 @@ BUrl::OpenWithPreferredApplication(bool onProblemAskUser) const status = be_roster->Launch(_UrlMimeType().String(), 1, argv+1); if (status != B_OK) { +#if DEBUG fprintf(stderr, "Opening URL failed: %s\n", strerror(status)); +#endif } return status; From 09cbc86d0d94f06f5bf65071fccddf83060ed10c Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 11 May 2013 03:44:41 +0200 Subject: [PATCH 126/136] TTracker::RefsReceived(): Forward "be:*" message fields In some cases /bin/open puts some additional fields in the B_REFS_RECEIVED message, but those were completely ignored. This makes opening paths with appended line/column numbers actually work as expected. --- src/kits/tracker/Tracker.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/kits/tracker/Tracker.cpp b/src/kits/tracker/Tracker.cpp index 021fff7aea..26e99b6aba 100644 --- a/src/kits/tracker/Tracker.cpp +++ b/src/kits/tracker/Tracker.cpp @@ -830,11 +830,39 @@ TTracker::RefsReceived(BMessage* message) // copy over "Poses" messenger so that refs received // recipients know where the open came from BMessage* bundleThis = NULL; + BMessage stackBundleThis; BMessenger messenger; if (message->FindMessenger("TrackerViewToken", &messenger) == B_OK) { - bundleThis = new BMessage(); + bundleThis = &stackBundleThis; bundleThis->AddMessenger("TrackerViewToken", messenger); + } else { + // copy over any "be:*" fields -- e.g. /bin/open may include + // "be:line" and "be:column" + for (int32 i = 0;; i++) { + char* name; + type_code type; + int32 count; + status_t error = message->GetInfo(B_ANY_TYPE, i, &name, + &type, &count); + if (error != B_OK) + break; + if (strncmp(name, "be:", 3) != 0) + continue; + for (int32 k = 0; k < count; k++) { + const void* data; + ssize_t size; + if (message->FindData(name, type, k, &data, &size) + != B_OK) { + break; + } + if (stackBundleThis.AddData(name, type, data, size) + != B_OK) { + break; + } + bundleThis = &stackBundleThis; + } + } } for (int32 index = 0; index < count; index++) { @@ -854,7 +882,6 @@ TTracker::RefsReceived(BMessage* message) bundleThis); } - delete bundleThis; break; } } From 7de99f83417fa30af420669e56f8cdb5342c3e61 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Fri, 10 May 2013 23:21:51 -0400 Subject: [PATCH 127/136] Fix Terminal build. --- src/apps/terminal/TermView.cpp | 6 +++--- src/apps/terminal/TermView.h | 2 +- src/apps/terminal/TermViewStates.cpp | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/apps/terminal/TermView.cpp b/src/apps/terminal/TermView.cpp index 16590e5fd7..610208e931 100644 --- a/src/apps/terminal/TermView.cpp +++ b/src/apps/terminal/TermView.cpp @@ -485,7 +485,7 @@ TermView::_LineOffset(int32 index) // convert view coordinates to terminal text buffer position -inline TermPos +TermPos TermView::_ConvertToTerminal(const BPoint &p) { return TermPos(p.x >= 0 ? (int32)p.x / fFontWidth : -1, _LineAt(p.y)); @@ -2626,14 +2626,14 @@ TermView::_CheckHighlightRegion(int32 row, int32 firstColumn, } continue; } - + if (row == highlight->End().y && firstColumn < highlight->End().x && lastColumn >= highlight->End().x) { // region starts in the highlight, but exceeds the end lastColumn = highlight->End().x - 1; return highlight; } - + TermPos pos(firstColumn, row); if (highlight->RangeContains(pos)) return highlight; diff --git a/src/apps/terminal/TermView.h b/src/apps/terminal/TermView.h index 5fc9c34482..a1ab24ed22 100644 --- a/src/apps/terminal/TermView.h +++ b/src/apps/terminal/TermView.h @@ -176,7 +176,7 @@ private: // point and text offset conversion inline int32 _LineAt(float y); inline float _LineOffset(int32 index); - inline TermPos _ConvertToTerminal(const BPoint& point); + TermPos _ConvertToTerminal(const BPoint& point); inline BPoint _ConvertFromTerminal(const TermPos& pos); inline void _InvalidateTextRect(int32 x1, int32 y1, diff --git a/src/apps/terminal/TermViewStates.cpp b/src/apps/terminal/TermViewStates.cpp index 8a85173bc5..9591983adf 100644 --- a/src/apps/terminal/TermViewStates.cpp +++ b/src/apps/terminal/TermViewStates.cpp @@ -17,6 +17,7 @@ #include "TermViewStates.h" #include +#include #include #include From ee7f4fab922f4dbfa30748cd2753c5d8beea4099 Mon Sep 17 00:00:00 2001 From: Niels Sascha Reedijk Date: Sat, 11 May 2013 06:16:42 +0200 Subject: [PATCH 128/136] Update translations from Pootle --- .../devices/keyboard/pt_BR.catkeys | 2 +- .../add-ons/translators/gif/pt_BR.catkeys | 4 +-- data/catalogs/apps/deskbar/pt_BR.catkeys | 6 +++- data/catalogs/apps/terminal/pt_BR.catkeys | 3 +- data/catalogs/kits/be.catkeys | 3 +- data/catalogs/kits/de.catkeys | 3 +- data/catalogs/kits/fi.catkeys | 3 +- data/catalogs/kits/fr.catkeys | 3 +- data/catalogs/kits/hu.catkeys | 3 +- data/catalogs/kits/pt_BR.catkeys | 4 ++- data/catalogs/kits/textencoding/de.catkeys | 3 +- data/catalogs/kits/textencoding/pt_BR.catkeys | 3 +- data/catalogs/kits/tracker/be.catkeys | 3 +- data/catalogs/kits/tracker/de.catkeys | 3 +- data/catalogs/kits/tracker/el.catkeys | 3 +- data/catalogs/kits/tracker/fi.catkeys | 3 +- data/catalogs/kits/tracker/fr.catkeys | 3 +- data/catalogs/kits/tracker/hi.catkeys | 3 +- data/catalogs/kits/tracker/hu.catkeys | 3 +- data/catalogs/kits/tracker/ja.catkeys | 5 ++- data/catalogs/kits/tracker/pt_BR.catkeys | 6 +++- .../preferences/appearance/de.catkeys | 3 +- .../preferences/appearance/pt_BR.catkeys | 4 ++- data/catalogs/preferences/mail/fr.catkeys | 2 +- data/catalogs/preferences/network/be.catkeys | 3 +- .../preferences/notifications/be.catkeys | 3 +- data/catalogs/preferences/time/be.catkeys | 6 +++- data/catalogs/servers/print/be.catkeys | 3 +- data/catalogs/servers/print/pt_BR.catkeys | 3 +- .../net/preflet/InterfacesAddOn/pt_BR.catkeys | 33 +++++++++++++++++++ 30 files changed, 90 insertions(+), 42 deletions(-) create mode 100644 data/catalogs/tests/kits/net/preflet/InterfacesAddOn/pt_BR.catkeys diff --git a/data/catalogs/add-ons/input_server/devices/keyboard/pt_BR.catkeys b/data/catalogs/add-ons/input_server/devices/keyboard/pt_BR.catkeys index 0dd28a58f3..e345e9ab9b 100644 --- a/data/catalogs/add-ons/input_server/devices/keyboard/pt_BR.catkeys +++ b/data/catalogs/add-ons/input_server/devices/keyboard/pt_BR.catkeys @@ -1,7 +1,7 @@ 1 portuguese (brazil) x-vnd.Haiku-KeyboardInputServerDevice 2536418998 Kill application Team monitor Matar aplicação Quit application Team monitor Fechar aplicativo -Select an application from the list above and click one of the buttons 'Kill application' and 'Quit application' in order to close it.\n\nHold CONTROL+ALT+DELETE for %ld seconds to reboot. Team monitor Selecione uma aplicação da lista acima e clique um dos botões 'Matar aplicativo' e 'Fechar aplicativo' de maneira a fechá-lo.\n\nPressione CONTROL+ALT+DELETE por %ld segundos para reiniciar. +Select an application from the list above and click one of the buttons 'Kill application' and 'Quit application' in order to close it.\n\nHold CONTROL+ALT+DELETE for %ld seconds to reboot. Team monitor Selecione um aplicativo da lista acima e clique um dos botões 'Matar aplicativo' e 'Fechar aplicativo' de maneira a fechá-lo.\n\nPressione CONTROL+ALT+DELETE por %ld segundos para reiniciar. If the application will not quit you may have to kill it. Team monitor Se a aplicação não fechar, você deve matá-la. Force reboot Team monitor Forçar a reinicialização Team monitor Team monitor Monitor de equipe diff --git a/data/catalogs/add-ons/translators/gif/pt_BR.catkeys b/data/catalogs/add-ons/translators/gif/pt_BR.catkeys index 28d7e456ec..ac6f390946 100644 --- a/data/catalogs/add-ons/translators/gif/pt_BR.catkeys +++ b/data/catalogs/add-ons/translators/gif/pt_BR.catkeys @@ -1,11 +1,11 @@ 1 portuguese (brazil) x-vnd.Haiku-GIFTranslator 2708495435 Websafe GIFView Websafe Write interlaced images GIFView Escrever imagens entrelaçadas -Optimal GIFView Ideal +Optimal GIFView Ótimo Greyscale GIFView Escala de cinza Be Bitmap Format (GIFTranslator) GIFTranslator Formato de Mapa de Bits Be (Tradutor GIF) GIF image translator GIFView Tradutor de imagem GIF -GIF image GIFTranslator imagem GIF +GIF image GIFTranslator Imagem GIF Write transparent images GIFView Gravar imagens transparentes Palette GIFView Paleta Use RGB color GIFView Usar cor RGB diff --git a/data/catalogs/apps/deskbar/pt_BR.catkeys b/data/catalogs/apps/deskbar/pt_BR.catkeys index 55d70242bb..bf9581185b 100644 --- a/data/catalogs/apps/deskbar/pt_BR.catkeys +++ b/data/catalogs/apps/deskbar/pt_BR.catkeys @@ -1,16 +1,19 @@ -1 portuguese (brazil) x-vnd.Be-TSKB 1042823442 +1 portuguese (brazil) x-vnd.Be-TSKB 2335730970 Power off DeskbarMenu Desligar +Sort applications by name PreferencesWindow Ordenar aplicativos pelo nome Suspend DeskbarMenu Suspender Hide clock TimeView Ocultar relógio Applications PreferencesWindow Aplicativos Time preferences… TimeView Preferências de hora… About Haiku DeskbarMenu Sobre o Haiku +Edit in Tracker… PreferencesWindow Editar no Rastreador… Recent documents: PreferencesWindow Documentos recentes: Recent applications DeskbarMenu Aplicativos recentes Applications B_USER_DESKBAR_DIRECTORY/Applications Aplicativos Find… DeskbarMenu Localizar… Show clock Tray Exibir relógio Window PreferencesWindow Janela +Defaults PreferencesWindow Padrões Menu PreferencesWindow Menu Recent documents DeskbarMenu Documentos recentes Auto-hide PreferencesWindow Ocultar automaticamente @@ -28,6 +31,7 @@ Restart Tracker DeskbarMenu Reiniciar Rastreador Close all WindowMenu Fechar tudo Deskbar preferences PreferencesWindow Preferências da Deskbar Mount DeskbarMenu Montar +Revert PreferencesWindow Reverter Small PreferencesWindow Pequeno Recent applications: PreferencesWindow Aplicativos recentes: Shutdown… DeskbarMenu Desligar… diff --git a/data/catalogs/apps/terminal/pt_BR.catkeys b/data/catalogs/apps/terminal/pt_BR.catkeys index 3ed2a75e3d..0ee0309ab8 100644 --- a/data/catalogs/apps/terminal/pt_BR.catkeys +++ b/data/catalogs/apps/terminal/pt_BR.catkeys @@ -1,4 +1,4 @@ -1 portuguese (brazil) x-vnd.Haiku-Terminal 328707356 +1 portuguese (brazil) x-vnd.Haiku-Terminal 2967760334 Not found. Terminal TermWindow Não localizado. Switch Terminals Terminal TermWindow Alternar Terminais Change directory Terminal TermView Mudar de pasta @@ -79,6 +79,7 @@ Clear all Terminal TermWindow Limpar tudo Text encoding Terminal TermWindow Codificação de texto size Terminal TermView tamanho Close window Terminal TermWindow Fechar janela +\t%d\t-\tThe current working directory of the active process in the\n\t\t\tcurrent tab. Optionally the maximum number of path components\n\t\t\tcan be specified. E.g. '%2d' for at most two components.\n\t%T\t-\tThe Terminal application name for the current locale.\n\t%e\t-\tThe encoding of the current tab. Not shown for UTF-8.\n\t%i\t-\tThe index of the window.\n\t%p\t-\tThe name of the active process in the current tab.\n\t%t\t-\tThe title of the current tab.\n\t%%\t-\tThe character '%'. Terminal ToolTips \t%d\t-\tO diretório atualmente em uso do processo ativo na\n\t\t\tguia atual. Opcionalmente o número máximo de componentes do caminho\n\t\t\tpode ser especificado. Por exemplo, '%2d' para ao menos dois componentes.\n\t%T\t-\tO nome do aplicativo Terminal para a localidade atual.\n\t%e\t-\tA codificação da guia atual. Não exibido para UTF-8.\n\t%i\t-\tO índice da janela.\n\t%p\t-\tO nome do processo ativo na guia atual.\n\t%t\t-\tO título da guia atual.\n\t%%\t-\tO caractere '%'. Save as default Terminal TermWindow Salvar como padrão Set tab title Terminal TermWindow Definir o título da guia Settings… Terminal TermWindow Configurações... diff --git a/data/catalogs/kits/be.catkeys b/data/catalogs/kits/be.catkeys index 55fa824a9f..f8f9f5fea6 100644 --- a/data/catalogs/kits/be.catkeys +++ b/data/catalogs/kits/be.catkeys @@ -1,4 +1,4 @@ -1 belarusian x-vnd.Haiku-libbe 672385853 +1 belarusian x-vnd.Haiku-libbe 677628532 gamma AboutWindow гамма beta AboutWindow бэта %3.2f GiB StringForSize %3.2f ГіБ @@ -7,7 +7,6 @@ About %app% AboutMenuItem Пра %app% Cut TextView Выразаць Version AboutWindow Версія Cannot create the replicant for \"%description\".\n%error ZombieReplicantView Немагчыма стварыць рэплікант \"%description\".\n%error -About AboutWindow Пра праграму Copy TextView Капіяваць %3.2f KiB StringForSize %3.2f КіБ %d bytes StringForSize %d байтаў diff --git a/data/catalogs/kits/de.catkeys b/data/catalogs/kits/de.catkeys index 077aa2cfa7..c790fa4bff 100644 --- a/data/catalogs/kits/de.catkeys +++ b/data/catalogs/kits/de.catkeys @@ -1,4 +1,4 @@ -1 german x-vnd.Haiku-libbe 672385853 +1 german x-vnd.Haiku-libbe 677628532 gamma AboutWindow Gamma beta AboutWindow Beta %3.2f GiB StringForSize %3.2f GiB @@ -7,7 +7,6 @@ About %app% AboutMenuItem Über %app% Cut TextView Ausschneiden Version AboutWindow Version Cannot create the replicant for \"%description\".\n%error ZombieReplicantView Replikant für \"%description\" konnte nicht erstellt werden.\n%error -About AboutWindow Über Copy TextView Kopieren %3.2f KiB StringForSize %3.2f KiB %d bytes StringForSize %d Bytes diff --git a/data/catalogs/kits/fi.catkeys b/data/catalogs/kits/fi.catkeys index c82592ed8a..55e2bf7acd 100644 --- a/data/catalogs/kits/fi.catkeys +++ b/data/catalogs/kits/fi.catkeys @@ -1,4 +1,4 @@ -1 finnish x-vnd.Haiku-libbe 672385853 +1 finnish x-vnd.Haiku-libbe 677628532 gamma AboutWindow gamma beta AboutWindow beeta %3.2f GiB StringForSize %3.2f gibitavua @@ -7,7 +7,6 @@ About %app% AboutMenuItem Ohjelmasta %app% Cut TextView Leikkaa Version AboutWindow Versio Cannot create the replicant for \"%description\".\n%error ZombieReplicantView Ei voida luoda replikanttia kohteelle ”%description”.\n%error -About AboutWindow Ohjelmasta Copy TextView Kopioi %3.2f KiB StringForSize %3.2f kibitavua %d bytes StringForSize %d tavua diff --git a/data/catalogs/kits/fr.catkeys b/data/catalogs/kits/fr.catkeys index 20c4b12e6b..9b5a0eebab 100644 --- a/data/catalogs/kits/fr.catkeys +++ b/data/catalogs/kits/fr.catkeys @@ -1,4 +1,4 @@ -1 french x-vnd.Haiku-libbe 672385853 +1 french x-vnd.Haiku-libbe 677628532 gamma AboutWindow gamma beta AboutWindow bêta %3.2f GiB StringForSize %3.2f Gio @@ -7,7 +7,6 @@ About %app% AboutMenuItem À propos de %app% Cut TextView Couper Version AboutWindow Version Cannot create the replicant for \"%description\".\n%error ZombieReplicantView Impossible de créer le réplicant pour « %description ».\n%error -About AboutWindow À propos Copy TextView Copier %3.2f KiB StringForSize %3.2f Kio %d bytes StringForSize %d octets diff --git a/data/catalogs/kits/hu.catkeys b/data/catalogs/kits/hu.catkeys index a1fa48c9cc..55d05b4ea8 100644 --- a/data/catalogs/kits/hu.catkeys +++ b/data/catalogs/kits/hu.catkeys @@ -1,4 +1,4 @@ -1 hungarian x-vnd.Haiku-libbe 672385853 +1 hungarian x-vnd.Haiku-libbe 677628532 gamma AboutWindow gamma beta AboutWindow béta %3.2f GiB StringForSize %3.2f GB @@ -7,7 +7,6 @@ About %app% AboutMenuItem %app% névjegye Cut TextView Kivágás Version AboutWindow Verzió Cannot create the replicant for \"%description\".\n%error ZombieReplicantView Nem lehet replikánst létrehozni ehhez: %description.\n%error -About AboutWindow Névjegy Copy TextView Másolás %3.2f KiB StringForSize %3.2f KB %d bytes StringForSize %Ld byte diff --git a/data/catalogs/kits/pt_BR.catkeys b/data/catalogs/kits/pt_BR.catkeys index da5b30ef48..fc1d39d260 100644 --- a/data/catalogs/kits/pt_BR.catkeys +++ b/data/catalogs/kits/pt_BR.catkeys @@ -1,4 +1,4 @@ -1 portuguese (brazil) x-vnd.Haiku-libbe 677628532 +1 portuguese (brazil) x-vnd.Haiku-libbe 3504008668 gamma AboutWindow gama beta AboutWindow beta %3.2f GiB StringForSize %3.2f GB @@ -14,9 +14,11 @@ alpha AboutWindow alfa Error PrintJob Erro No Pages to print! PrintJob Nenhuma Página para imprimir! All Rights Reserved. AboutWindow Todos os direitos reservados. +About %app% AboutWindow Sobre %app% OK Dragger OK OK PrintJob OK Green: ColorControl Verde: +Ok AboutWindow Ok Version history: AboutWindow Histórico de versões Remove replicant Dragger Remover replicante OK ZombieReplicantView OK diff --git a/data/catalogs/kits/textencoding/de.catkeys b/data/catalogs/kits/textencoding/de.catkeys index 7128647750..b1e5ab410f 100644 --- a/data/catalogs/kits/textencoding/de.catkeys +++ b/data/catalogs/kits/textencoding/de.catkeys @@ -1,4 +1,4 @@ -1 german x-vnd.Haiku-libtextencoding 3062073902 +1 german x-vnd.Haiku-libtextencoding 1525027211 ISO Greek textencodings ISO Griechisch ISO South European textencodings ISO Südeuropäisch Chinese Big5 textencodings Chinesisch Big5 @@ -7,6 +7,7 @@ ISO Arabic textencodings ISO Arabisch ISO Latin 9 textencodings ISO Latin-9 Japanese Shift JIS textencodings Japanisch (Shift-JIS) DOS Cyrillic textencodings DOS Kyrillisch +Windows Central European (CP 1250) textencodings Windows Zentraleuropäisch (CP 1250) Windows Cyrillic (CP 1251) textencodings Kyrillisch Windows (CP 1251) Japanese EUC textencodings Japanisch EUC Unicode textencodings Unicode diff --git a/data/catalogs/kits/textencoding/pt_BR.catkeys b/data/catalogs/kits/textencoding/pt_BR.catkeys index 6f994abe68..c2a358fe6b 100644 --- a/data/catalogs/kits/textencoding/pt_BR.catkeys +++ b/data/catalogs/kits/textencoding/pt_BR.catkeys @@ -1,4 +1,4 @@ -1 portuguese (brazil) x-vnd.Haiku-libtextencoding 3062073902 +1 portuguese (brazil) x-vnd.Haiku-libtextencoding 1525027211 ISO Greek textencodings Grego ISO ISO South European textencodings Europeu do Sul ISO Chinese Big5 textencodings Chinês Big5 @@ -7,6 +7,7 @@ ISO Arabic textencodings Árabe ISO ISO Latin 9 textencodings Latino 9 ISO Japanese Shift JIS textencodings Japonês Shift JIS DOS Cyrillic textencodings Cirílico DOS +Windows Central European (CP 1250) textencodings Windows Centro-europeu (CP 1250) Windows Cyrillic (CP 1251) textencodings Cirílico Windows (CP 1251) Japanese EUC textencodings Japonês EUC Unicode textencodings Unicode diff --git a/data/catalogs/kits/tracker/be.catkeys b/data/catalogs/kits/tracker/be.catkeys index 8a10544139..b561a32c54 100644 --- a/data/catalogs/kits/tracker/be.catkeys +++ b/data/catalogs/kits/tracker/be.catkeys @@ -1,4 +1,4 @@ -1 belarusian x-vnd.Haiku-libtracker 4167158175 +1 belarusian x-vnd.Haiku-libtracker 1638733886 common B_COMMON_DIRECTORY агульны OK WidgetAttributeText ОК Icon view VolumeWindow Від іконак @@ -212,7 +212,6 @@ Resize to fit VolumeWindow Расцягнуць Could not find application \"%appname\" OpenWithWindow Не ўдалося знайсці праграму \"%appname\" The selected item cannot be moved to the Trash. Would you like to delete it instead? (This operation cannot be reverted.) PoseView Выбраны элемент нельга адправіць у Сметніцу. Жадаеце выдаліць іх беззваротна? Invert SelectionWindow Інвертаваць -Save Query as template… FindPanel Захаваць Запыт як шаблон… rename InfoWindow As in 'if you rename this folder...' (en) 'Wird dieser Ordner umbenannt...' (de) перайменуеце Find FindPanel Знайсці Move FSUtils Button label, 'Move' (en), 'Verschieben' (de) Перасунуць diff --git a/data/catalogs/kits/tracker/de.catkeys b/data/catalogs/kits/tracker/de.catkeys index 96eb7df55e..c617eafbe9 100644 --- a/data/catalogs/kits/tracker/de.catkeys +++ b/data/catalogs/kits/tracker/de.catkeys @@ -1,4 +1,4 @@ -1 german x-vnd.Haiku-libtracker 4167158175 +1 german x-vnd.Haiku-libtracker 1638733886 common B_COMMON_DIRECTORY Allgemein OK WidgetAttributeText OK Icon view VolumeWindow Icon-Ansicht @@ -212,7 +212,6 @@ Resize to fit VolumeWindow Optimale Größe Could not find application \"%appname\" OpenWithWindow Die Anwendung \"%appname\" wurde nicht gefunden. The selected item cannot be moved to the Trash. Would you like to delete it instead? (This operation cannot be reverted.) PoseView Das ausgewählte Objekt kann nicht in den Papierkorb verschoben werden. Soll es stattdessen gelöscht werden? (Diese Aktion kann nicht rückgängig gemacht werden.) Invert SelectionWindow Umkehren -Save Query as template… FindPanel Query als Vorlage speichern… rename InfoWindow As in 'if you rename this folder...' (en) 'Wird dieser Ordner umbenannt...' (de) umbenannt Find FindPanel Suchen Move FSUtils Button label, 'Move' (en), 'Verschieben' (de) Verschieben diff --git a/data/catalogs/kits/tracker/el.catkeys b/data/catalogs/kits/tracker/el.catkeys index 635f8873cf..7be265f80c 100644 --- a/data/catalogs/kits/tracker/el.catkeys +++ b/data/catalogs/kits/tracker/el.catkeys @@ -1,4 +1,4 @@ -1 greek, modern (1453-) x-vnd.Haiku-libtracker 3015739927 +1 greek, modern (1453-) x-vnd.Haiku-libtracker 487315638 common B_COMMON_DIRECTORY κοινό OK WidgetAttributeText Εντάξει Icon view VolumeWindow Προβολή εικονιδίου @@ -197,7 +197,6 @@ Resize to fit VolumeWindow Αλλαγή μεγέθους για να χωράε Could not find application \"%appname\" OpenWithWindow Αδυναμία εύρεσης της εφαρμογής \"%appname\" The selected item cannot be moved to the Trash. Would you like to delete it instead? (This operation cannot be reverted.) PoseView To επιλεγμένο στοιχείο δε μπορεί να μετακινηθεί στον κάδο απορριμμάτων. Θα θέλατε να το διαγράψετε αντ' αυτού; (Αυτή η λειτουργία δεν μπορεί να επανέλθει.) Invert SelectionWindow Αντιστροφή -Save Query as template… FindPanel Αποθήκευση του ερωτήματος ως πρότυπο... rename InfoWindow As in 'if you rename this folder...' (en) 'Wird dieser Ordner umbenannt...' (de) μετονομασία Find FindPanel Εύρεση Move FSUtils Button label, 'Move' (en), 'Verschieben' (de) Μετακίνηση diff --git a/data/catalogs/kits/tracker/fi.catkeys b/data/catalogs/kits/tracker/fi.catkeys index 2987ff7db6..6e53f69270 100644 --- a/data/catalogs/kits/tracker/fi.catkeys +++ b/data/catalogs/kits/tracker/fi.catkeys @@ -1,4 +1,4 @@ -1 finnish x-vnd.Haiku-libtracker 4167158175 +1 finnish x-vnd.Haiku-libtracker 1638733886 common B_COMMON_DIRECTORY yhteinen OK WidgetAttributeText Valmis Icon view VolumeWindow Kuvakenäkymä @@ -212,7 +212,6 @@ Resize to fit VolumeWindow Muunna koko sopimaan Could not find application \"%appname\" OpenWithWindow Ei voitu löytää sovellusta ”%appname” The selected item cannot be moved to the Trash. Would you like to delete it instead? (This operation cannot be reverted.) PoseView Valittua kohdetta ei voida siirtää roskakoriin. Haluaisitko sen sijaan poistaa sen? (Tätä toimintoa ei voida palauttaa.) Invert SelectionWindow Käänteinen -Save Query as template… FindPanel Tallenna kysely mallinteena... rename InfoWindow As in 'if you rename this folder...' (en) 'Wird dieser Ordner umbenannt...' (de) nimeä uudelleen Find FindPanel Haku Move FSUtils Button label, 'Move' (en), 'Verschieben' (de) Siirrä diff --git a/data/catalogs/kits/tracker/fr.catkeys b/data/catalogs/kits/tracker/fr.catkeys index d1d68eb7ec..6e90007ccf 100644 --- a/data/catalogs/kits/tracker/fr.catkeys +++ b/data/catalogs/kits/tracker/fr.catkeys @@ -1,4 +1,4 @@ -1 french x-vnd.Haiku-libtracker 4167158175 +1 french x-vnd.Haiku-libtracker 1638733886 common B_COMMON_DIRECTORY commun OK WidgetAttributeText OK Icon view VolumeWindow Vue en icônes @@ -212,7 +212,6 @@ Resize to fit VolumeWindow Ajuster Could not find application \"%appname\" OpenWithWindow Impossible de trouver l'application « %appname » The selected item cannot be moved to the Trash. Would you like to delete it instead? (This operation cannot be reverted.) PoseView L'élément sélectionné ne peut pas être envoyé à la Corbeille. Voulez vous le supprimer ? (Cette opération est irrémédiable.) Invert SelectionWindow Inverser -Save Query as template… FindPanel Enregistrer le modèle de la requête… rename InfoWindow As in 'if you rename this folder...' (en) 'Wird dieser Ordner umbenannt...' (de) renommez Find FindPanel Rechercher Move FSUtils Button label, 'Move' (en), 'Verschieben' (de) Déplacer diff --git a/data/catalogs/kits/tracker/hi.catkeys b/data/catalogs/kits/tracker/hi.catkeys index 00fd369d00..b90716a724 100644 --- a/data/catalogs/kits/tracker/hi.catkeys +++ b/data/catalogs/kits/tracker/hi.catkeys @@ -1,4 +1,4 @@ -1 hindi x-vnd.Haiku-libtracker 1458537919 +1 hindi x-vnd.Haiku-libtracker 3225080926 common B_COMMON_DIRECTORY सामान्य OK WidgetAttributeText ठीक है Icon view VolumeWindow चिह्न दृश्य @@ -197,7 +197,6 @@ Resize to fit VolumeWindow आकार बदलने के फिट कर Could not find application \"%appname\" OpenWithWindow आवेदन नहीं मिला \"%appname\" The selected item cannot be moved to the Trash. Would you like to delete it instead? (This operation cannot be reverted.) PoseView चयनित आइटम को कचरा पेटी में स्थानांतरित नहीं किया जा सकता है. क्या आप इसे इसकी बजाय मिटाना चाहते हैं? (यह आपरेशन किया जाना है. नहीं लौट सकते हैं) Invert SelectionWindow पलटे -Save Query as template… FindPanel टेम्पलेट के रूप में सहेजें क्वेरी... rename InfoWindow As in 'if you rename this folder...' (en) 'Wird dieser Ordner umbenannt...' (de) फिर से नाम दें Find FindPanel खोजें Move FSUtils Button label, 'Move' (en), 'Verschieben' (de) मूव diff --git a/data/catalogs/kits/tracker/hu.catkeys b/data/catalogs/kits/tracker/hu.catkeys index ae42ac9ffe..65ea2318a7 100644 --- a/data/catalogs/kits/tracker/hu.catkeys +++ b/data/catalogs/kits/tracker/hu.catkeys @@ -1,4 +1,4 @@ -1 hungarian x-vnd.Haiku-libtracker 4167158175 +1 hungarian x-vnd.Haiku-libtracker 1638733886 common B_COMMON_DIRECTORY Közös OK WidgetAttributeText Rendben Icon view VolumeWindow Ikon nézet @@ -212,7 +212,6 @@ Resize to fit VolumeWindow Átméretezés hogy elférjen Could not find application \"%appname\" OpenWithWindow A program (%appname) nem található The selected item cannot be moved to the Trash. Would you like to delete it instead? (This operation cannot be reverted.) PoseView A kiválasztott elemet nem lehet a Szemetesbe mozgatni. Szeretné inkább törölni? (Nem vonható vissza.) Invert SelectionWindow Megfordítás -Save Query as template… FindPanel Keresés mentése sablonként… rename InfoWindow As in 'if you rename this folder...' (en) 'Wird dieser Ordner umbenannt...' (de) átnevezi Find FindPanel Keresés Move FSUtils Button label, 'Move' (en), 'Verschieben' (de) Mozgatás diff --git a/data/catalogs/kits/tracker/ja.catkeys b/data/catalogs/kits/tracker/ja.catkeys index 818cf1daa5..885c833543 100644 --- a/data/catalogs/kits/tracker/ja.catkeys +++ b/data/catalogs/kits/tracker/ja.catkeys @@ -1,4 +1,4 @@ -1 japanese x-vnd.Haiku-libtracker 419889716 +1 japanese x-vnd.Haiku-libtracker 1188087477 common B_COMMON_DIRECTORY 一般 OK WidgetAttributeText OK Icon view VolumeWindow アイコン表示 @@ -141,6 +141,7 @@ Add-ons ContainerWindow アドオン Edit templates… TemplatesMenu テンプレートを編集… Finish: %time - Over %finishtime left StatusWindow 終了: %time - 残り %finishtime 以上 An item named \"%name\" already exists in this folder. Would you like to replace it with the symbolic link you are creating? FSUtils このフォルダーにすでに \"%name\" という項目があります。作成しようとしているシンボリックリンクと置き換えますか? +Fewer options FindPanel 検索オプションを隠す Sorry, there is not enough free space on the destination volume to copy the selection. FSUtils コピー先ディスクの空き容量が不足しています。コピーができません。 Could not open \"%document\" with application \"%app\" (%error). FSUtils アプリケーション \"%app\" を使って \"%document\" を開けませんでした (%error)。 Sorry, saving more than one item is not allowed. FilePanelPriv 2 項目以上は保存できません。 @@ -234,6 +235,7 @@ Temporary FindPanel 一時的なクエリ Version OpenWithWindow バージョン Default application InfoWindow デフォルトアプリケーション Preparing to copy items… StatusWindow コピーの準備をしています… +Save query as template… FindPanel クエリテンプレートとして保存… Show folder location in title tab SettingsView タイトルタブにフォルダー位置を表示 Proceed FSUtils 続行 Some items already exist in this folder with the same names as the items you are %verb.\n \nWould you like to replace them with the ones you are %verb or be prompted for each one? FSUtils %verbしようとしているものと同じ名前の項目がすでにフォルダーの中に存在します。\n \n%verbして置き換えますか?それとも、一つずつ確認しますか? @@ -331,6 +333,7 @@ The specified name is already used as the name of a folder. Please choose anothe Clean up ContainerWindow アイコンの整列 after FindPanel 以降 Select… QueryContainerWindow 選択… +More options FindPanel 検索オプションを表示 link FSUtils filename link リンク At %func \nfind_directory() failed. \nReason: %error TrackerInitialState %func にて\nfind_directory() が失敗。\nエラー: %error The specified name is illegal. Please choose another name. FilePanelPriv 指定された名前は利用できない文字を含んでいます。他の名前を指定してください。 diff --git a/data/catalogs/kits/tracker/pt_BR.catkeys b/data/catalogs/kits/tracker/pt_BR.catkeys index 98be8e2683..45b1b265ba 100644 --- a/data/catalogs/kits/tracker/pt_BR.catkeys +++ b/data/catalogs/kits/tracker/pt_BR.catkeys @@ -1,4 +1,4 @@ -1 portuguese (brazil) x-vnd.Haiku-libtracker 1638733886 +1 portuguese (brazil) x-vnd.Haiku-libtracker 1762695842 common B_COMMON_DIRECTORY comum OK WidgetAttributeText OK Icon view VolumeWindow Em ícones @@ -143,6 +143,7 @@ Add-ons ContainerWindow Adicionais Edit templates… TemplatesMenu Editar modelos... Finish: %time - Over %finishtime left StatusWindow Término: %time - Mais de %finishtime restante An item named \"%name\" already exists in this folder. Would you like to replace it with the symbolic link you are creating? FSUtils Um item chamado \"%name\" já existe nesta pasta. Gostaria de substituí-lo pelo link simbólico que está sendo criado? +Fewer options FindPanel Menos opções Sorry, there is not enough free space on the destination volume to copy the selection. FSUtils Desculpe, não existe espaço livre suficiente no volume de destino para para copiar a seleção. Could not open \"%document\" with application \"%app\" (%error). FSUtils Não foi possível abrir \"%document\" com a aplicativo \"%app\" (%error). Sorry, saving more than one item is not allowed. FilePanelPriv Desculpe, salvar mais de um item não é permitido. @@ -236,6 +237,7 @@ Temporary FindPanel Temporário Version OpenWithWindow Versão Default application InfoWindow Aplicativo padrão Preparing to copy items… StatusWindow Preparando para copiar itens... +Save query as template… FindPanel Salvar consulta como modelo… Show folder location in title tab SettingsView Mostrar local da pasta na barra de títulos Proceed FSUtils Prosseguir Some items already exist in this folder with the same names as the items you are %verb.\n \nWould you like to replace them with the ones you are %verb or be prompted for each one? FSUtils Alguns itens já existem nesta pasta com os mesmos nomes dos itens que você quer %verb.\n \nVocê gostaria de substituí-los com aqueles que você vai %verb ou ser perguntado em cada um? @@ -334,6 +336,7 @@ The specified name is already used as the name of a folder. Please choose anothe Clean up ContainerWindow Limpeza after FindPanel após Select… QueryContainerWindow Selecionar… +More options FindPanel Mais opções link FSUtils filename link vínculo At %func \nfind_directory() failed. \nReason: %error TrackerInitialState Em %func \nfind_directory() falhou. \nRazão: %error The specified name is illegal. Please choose another name. FilePanelPriv O nome especificado é ilegal. Por favor escolha outro nome. @@ -445,6 +448,7 @@ contains FindPanel contém Relation OpenWithWindow Relação Open FilePanelPriv Abrir Mount DeskWindow Montar +Recent queries FindPanel Consultas recentes Mount ContainerWindow Montar %capacity (%used used -- %free free) InfoWindow %capacity (%used utilizados -- %free livres) Cancel FSClipBoard Cancelar diff --git a/data/catalogs/preferences/appearance/de.catkeys b/data/catalogs/preferences/appearance/de.catkeys index 0783140413..99055020de 100644 --- a/data/catalogs/preferences/appearance/de.catkeys +++ b/data/catalogs/preferences/appearance/de.catkeys @@ -1,4 +1,4 @@ -1 german x-vnd.Haiku-Appearance 2993758435 +1 german x-vnd.Haiku-Appearance 727801787 Plain font: Font view Normal: Control highlight Colors tab Steuerelement - Ausgewählt Control border Colors tab Steuerelement - Rahmen @@ -50,6 +50,7 @@ The quick brown fox jumps over the lazy dog. Font Selection view Don't translate %decorName\n\nAuthors:\n\t%decorAuthors\n\nURL: %decorURL\nLicense: %decorLic\n\n%decorDesc\n DecorSettingsView %decorName\n\nAutoren:\n\t%decorAuthors\n\nURL: %decorURL\nLizens: %decorLic\n\n%decorDesc\n Reduce colored edges filter strength: AntialiasingSettingsView Farbsaumfilter: Subpixel based anti-aliasing in combination with glyph hinting is not available in this build of Haiku to avoid possible patent issues. To enable this feature, you have to build Haiku yourself and enable certain options in the libfreetype configuration header. AntialiasingSettingsView Zur Vermeidung von möglichen Patentproblemen ist die Kombination von Subpixel-Kantenglättung und Glyph-Hinting deaktiviert. Um diese Funktion zu aktivieren, müssen spezielle Optionen im Konfigurationsheader der Freetype-Bibliothek freigeschaltet und anschließend Haiku neu kompiliert werden. +Scroll bar thumb Colors tab Scroll-Balken Control text Colors tab Steuerelement - Text Single: DecorSettingsView Einfach: Tooltip text Colors tab Tooltip - Text diff --git a/data/catalogs/preferences/appearance/pt_BR.catkeys b/data/catalogs/preferences/appearance/pt_BR.catkeys index d0ddb5ba57..1186e69d8b 100644 --- a/data/catalogs/preferences/appearance/pt_BR.catkeys +++ b/data/catalogs/preferences/appearance/pt_BR.catkeys @@ -1,4 +1,4 @@ -1 portuguese (brazil) x-vnd.Haiku-Appearance 1457181689 +1 portuguese (brazil) x-vnd.Haiku-Appearance 727801787 Plain font: Font view Fonte plana: Control highlight Colors tab Realce do controle Control border Colors tab Borda do controle @@ -16,6 +16,7 @@ Success Colors tab Sucesso Inactive window tab text Colors tab Texto da aba de janela inativa Failure Colors tab Falha Hinting menu AntialiasingSettingsView Menu de sugestão +Scroll bar: DecorSettingsView Barra de rolagem: Document background Colors tab Plano de fundo do documento Revert APRWindow Reverter Window tab Colors tab Aba da janela @@ -49,6 +50,7 @@ The quick brown fox jumps over the lazy dog. Font Selection view Don't translate %decorName\n\nAuthors:\n\t%decorAuthors\n\nURL: %decorURL\nLicense: %decorLic\n\n%decorDesc\n DecorSettingsView %decorName\n\nAutores:\n\t %decorAuthors\n\nURL: %decorURL\nLicença: %decorLic\n\n%decorDesc\n Reduce colored edges filter strength: AntialiasingSettingsView Reduzir a força do filtro de bordas coloridas: Subpixel based anti-aliasing in combination with glyph hinting is not available in this build of Haiku to avoid possible patent issues. To enable this feature, you have to build Haiku yourself and enable certain options in the libfreetype configuration header. AntialiasingSettingsView A possibilidade de usar o antiserrilhamento baseado em Subpíxeis juntamente com o alisamento de glifos não está disponível nesta versão do Haiku para evitar possíveis problemas com patentes. Para habilitar esta funcionalidade, você terá que compilar o Haiku e ativar certas opções no cabeçalho de configuração da libfreetype. +Scroll bar thumb Colors tab Botão da barra de rolagem Control text Colors tab Texto do controle Single: DecorSettingsView Único: Tooltip text Colors tab Texto da dica diff --git a/data/catalogs/preferences/mail/fr.catkeys b/data/catalogs/preferences/mail/fr.catkeys index f9d175b53c..e3d51d56bc 100644 --- a/data/catalogs/preferences/mail/fr.catkeys +++ b/data/catalogs/preferences/mail/fr.catkeys @@ -12,7 +12,7 @@ Start mail services on startup Config Window Lancer les services de mail au dé E-mail address: E-Mail Adresse email : Account name: E-Mail Nom du compte : Account name: Config Views Nom du compte : -Create new account AutoConfigWindow Créé un nouveau compte +Create new account AutoConfigWindow Créer un nouveau compte OK Config Views OK The filter could not be moved. Deleting filter. Config Views Le filtre n'a pas pu être déplacé. Suppression du filtre. Revert Config Window Rétablir diff --git a/data/catalogs/preferences/network/be.catkeys b/data/catalogs/preferences/network/be.catkeys index de89352c89..94c80730c5 100644 --- a/data/catalogs/preferences/network/be.catkeys +++ b/data/catalogs/preferences/network/be.catkeys @@ -1,10 +1,11 @@ -1 belarusian x-vnd.Haiku-Network 365183238 +1 belarusian x-vnd.Haiku-Network 781877986 Choose automatically EthernetSettingsView Выбіраць аўтаматычна Gateway: EthernetSettingsView Шлюз: Netmask: EthernetSettingsView Маска сеткі: DHCP EthernetSettingsView DHCP DNS #2: EthernetSettingsView DNS #2: Apply EthernetSettingsView Ужыць +Netmask is invalid EthernetSettingsView Няслушная маска падсеткі. OK EthernetSettingsView ОК DNS #1: EthernetSettingsView DNS #1: IP address: EthernetSettingsView IP адрас: diff --git a/data/catalogs/preferences/notifications/be.catkeys b/data/catalogs/preferences/notifications/be.catkeys index 50b00771b1..d3fc1bf1f9 100644 --- a/data/catalogs/preferences/notifications/be.catkeys +++ b/data/catalogs/preferences/notifications/be.catkeys @@ -1,4 +1,4 @@ -1 belarusian x-vnd.Haiku-Notifications 814394708 +1 belarusian x-vnd.Haiku-Notifications 2177286129 An error occurred saving the preferences.\nIt's possible you are running out of disk space. GeneralView Адбылася памылка пры захаванні наладак.\nМагчыма, не хапае месца на дыску. Notifications GeneralView Паведамленні seconds of inactivity GeneralView секунд прастою @@ -17,6 +17,7 @@ Cannot disable notifications because the server can't be reached. GeneralView Progress NotificationView Прагрэс Last Received NotificationView Апошняе атрыманае General PrefletView Агульныя +Apply PrefletWin Ужыць Display PrefletView Экран Can't enable notifications at startup time, you probably don't have write permission to the boot settings directory. GeneralView Не ўдалося занесці паведамленні ў аўтазапуск, магчыма, вы не маеце правоў на змяненне дырэкторыі аўтазапуску. Search: NotificationView Пошук: diff --git a/data/catalogs/preferences/time/be.catkeys b/data/catalogs/preferences/time/be.catkeys index 4294263f31..c91571db10 100644 --- a/data/catalogs/preferences/time/be.catkeys +++ b/data/catalogs/preferences/time/be.catkeys @@ -1,4 +1,4 @@ -1 belarusian x-vnd.Haiku-Time 3544635877 +1 belarusian x-vnd.Haiku-Time 3259467657 GMT (UNIX compatible) Time GMT (як у UNIX) OK Time ОК Asia Time Азія @@ -11,6 +11,7 @@ Preview time: Time Праглядзець час: Synchronize Time Сінхранізаваць Revert Time Адвярнуць Pacific Time Ціхі акіян +Show day of week Time Паказваць дзень тыдню Add Time Дадаць Date and time Time Дата і Час about Time пра праграму @@ -26,6 +27,7 @@ Time Time Час Indian Time Індыя Sending request failed Time Немагчыма адаслаць запыт Arctic Time Арктыка +Display time with seconds Time Паказваць час з секундамі Time System name Дата і Час America Time Амерыка Reset Time Скінуць @@ -33,6 +35,8 @@ Synchronize at boot Time Сінхранізаваць падчас старту Time & Date, written by:\n\n\tAndrew Edward McCall\n\tMike Berg\n\tJulun\n\tPhilippe Saint-Pierre\n\nCopyright 2004-2012, Haiku. Time Time & Date, распрацавана:\n\n\t Andrew Edward McCall\n\t Mike Berg\n\t Julun\n\t Philippe Saint-Pierre\n\nCopyright 2004-2012, Haiku. Received invalid time Time Атрыманы несапраўдны час Antarctica Time Антарктыка +Show time zone Time Паказаць часавы пояс +Show clock in Deskbar Time Паказваць гадзіннік у Deskbar-ы The following error occured while synchronizing:r\n%s: %s Time Памылка падчас сінхранізацыі:r\n%s: %s Time <Іншае> Current time: Time Сапраўдны час: diff --git a/data/catalogs/servers/print/be.catkeys b/data/catalogs/servers/print/be.catkeys index e9017a9d1c..ad461ee9a9 100644 --- a/data/catalogs/servers/print/be.catkeys +++ b/data/catalogs/servers/print/be.catkeys @@ -1,4 +1,4 @@ -1 belarusian x-vnd.Be-PSRV 1761631281 +1 belarusian x-vnd.Be-PSRV 123334776 Undefined ConfigWindow Нявызначаны Return the number of available transports PrintServerApp Scripting Вярнуць колькасць даступных транспортаў Return the number of available printers PrintServerApp Scripting Вярнуць колькасць даступных прынтэраў @@ -9,6 +9,7 @@ Retrieve a specific printer PrintServerApp Scripting Вызначыць аса Page %1 to %2 ConfigWindow Старонкі з %1 па %2 Get name of the printer add-on used for this printer Printer Scripting Вызначыць імя дапаўнення, ужытага для гэтага прынтэра Page setup: ConfigWindow Наладкі старонкі: +B5 (JIS) ConfigWindow JIS P0138 B5, a Japanese paper size B5 (JIS) OK ConfigWindow Так Cancel ConfigWindow Адмена Printer server ConfigWindow Сервер друку diff --git a/data/catalogs/servers/print/pt_BR.catkeys b/data/catalogs/servers/print/pt_BR.catkeys index ff31ef7bc3..9457d195bf 100644 --- a/data/catalogs/servers/print/pt_BR.catkeys +++ b/data/catalogs/servers/print/pt_BR.catkeys @@ -1,4 +1,4 @@ -1 portuguese (brazil) x-vnd.Be-PSRV 1761631281 +1 portuguese (brazil) x-vnd.Be-PSRV 123334776 Undefined ConfigWindow Indefinido Return the number of available transports PrintServerApp Scripting Mostrar o número de transportes disponíveis Return the number of available printers PrintServerApp Scripting Mostrar o número de impressoras disponíveis @@ -9,6 +9,7 @@ Retrieve a specific printer PrintServerApp Scripting Obter uma impressora espec Page %1 to %2 ConfigWindow Página %1 até %2 Get name of the printer add-on used for this printer Printer Scripting Obter o nome de um adicional usado para esta impressora Page setup: ConfigWindow Configurações de página: +B5 (JIS) ConfigWindow JIS P0138 B5, a Japanese paper size B5 (JIS) OK ConfigWindow OK Cancel ConfigWindow Cancelar Printer server ConfigWindow Servidor de impressão diff --git a/data/catalogs/tests/kits/net/preflet/InterfacesAddOn/pt_BR.catkeys b/data/catalogs/tests/kits/net/preflet/InterfacesAddOn/pt_BR.catkeys new file mode 100644 index 0000000000..6d4884a90f --- /dev/null +++ b/data/catalogs/tests/kits/net/preflet/InterfacesAddOn/pt_BR.catkeys @@ -0,0 +1,33 @@ +1 portuguese (brazil) x-vnd.Haiku-InterfacesAddOn 160108912 +Interface InterfaceWindow Interface +Configure… InterfacesListView Configurar… +Static IntefaceAddressView Estático +None InterfacesListView Nenhum +IP: InterfacesListView IPv4 address label IP: +Status: IntefaceHardwareView Estado: +IPv6: InterfacesListView IPv6 address label IPv6: +Save InterfaceWindow Salvar +Link speed: IntefaceHardwareView Velocidade do link: +Renegotiate InterfacesAddOn Renegociar +The method for obtaining an IP address IntefaceAddressView O método para obter um endereço IP +Your gateway IntefaceAddressView Sua rota padrão +Enable InterfacesListView Habilitar +Received: IntefaceHardwareView Recebido: +Revert InterfaceWindow Reverter +connected IntefaceHardwareView conectado +Gateway: IntefaceAddressView Rota padrão: +Disable InterfacesListView Desabilitar +Sent: IntefaceHardwareView Enviado: +Disable InterfacesAddOn Desabilitar +Configure… InterfacesAddOn Configurar… +Renegotiate Address InterfacesListView Endereço de renegociação +DHCP IntefaceAddressView DHCP +Mode: IntefaceAddressView Modo: +Your netmask IntefaceAddressView Sua máscara de rede +IP Address: IntefaceAddressView Endereço IP: +Off IntefaceAddressView Desligar +MAC address: IntefaceHardwareView Endereço MAC: +Netmask: IntefaceAddressView Máscara de rede: +Your IP address IntefaceAddressView Seu endereço IP +%llu KBytes IntefaceHardwareView %llu KBytes +disconnected IntefaceHardwareView desconectado From 9e1a0720cb3f2e15944658003beac1db18bf5c09 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 11 May 2013 07:29:34 +0200 Subject: [PATCH 129/136] Fix FFM focus loss on window close kFocusList is an invalid index for _Windows(). fWorkspaces would be accessed out of bounds. --- src/servers/app/Desktop.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp index 4663c0b9e3..f9e8d4553c 100644 --- a/src/servers/app/Desktop.cpp +++ b/src/servers/app/Desktop.cpp @@ -1903,12 +1903,15 @@ Desktop::SetFocusWindow(Window* nextFocus) return; } - uint32 list = fCurrentWorkspace; - if (!fSettings->NormalMouse()) - list = kFocusList; + uint32 listIndex = fCurrentWorkspace; + WindowList* list = &_Windows(fCurrentWorkspace); + if (!fSettings->NormalMouse()) { + listIndex = kFocusList; + list = &fFocusList; + } if (nextFocus == NULL || hasModal || hasWindowScreen) { - nextFocus = _Windows(list).LastWindow(); + nextFocus = list->LastWindow(); if (fSettings->NormalMouse()) { // If the last window having focus is a window that cannot make it @@ -1923,7 +1926,7 @@ Desktop::SetFocusWindow(Window* nextFocus) // make sure no window is chosen that doesn't want focus or cannot have it while (nextFocus != NULL && !_WindowCanHaveFocus(nextFocus)) { - nextFocus = nextFocus->PreviousWindow(list); + nextFocus = nextFocus->PreviousWindow(listIndex); } if (fFocus == nextFocus) { From 623528042506bf847008f8f6401ca3007169b065 Mon Sep 17 00:00:00 2001 From: Murai Takashi Date: Sat, 11 May 2013 09:02:01 +0200 Subject: [PATCH 130/136] libgnu.so: Fix GCC4.8 narrowing conversion warnings Signed-off-by: Jerome Duval --- src/libs/gnu/xattr.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/gnu/xattr.cpp b/src/libs/gnu/xattr.cpp index fadb573112..9873018ac6 100644 --- a/src/libs/gnu/xattr.cpp +++ b/src/libs/gnu/xattr.cpp @@ -43,7 +43,9 @@ struct AttributeName { // printable, just use them as the type string, otherwise convert // to hex char typeString[9]; - uint8 typeBytes[4] = { type >> 24, type >> 16, type >> 8, type }; + uint8 typeBytes[4] = { (uint8)((type >> 24) & 0xff), + (uint8)((type >> 16) & 0xff), (uint8)((type >> 8) & 0xff), + (uint8)(type & 0xff) }; if (isprint(typeBytes[0]) && isprint(typeBytes[1]) && isprint(typeBytes[2]) && isprint(typeBytes[3])) { typeString[0] = typeBytes[0]; From 1152f6eca6ae81c15242bcd87713cc48bac55980 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sat, 11 May 2013 13:08:35 +0100 Subject: [PATCH 131/136] HaikuImage: Build more network drivers for x86_64. --- build/jam/HaikuImage | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index d666bd3efc..479fc9477d 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -165,11 +165,11 @@ SYSTEM_ADD_ONS_DRIVERS_GRAPHICS = [ FFilterByBuildFeatures ] ; SYSTEM_ADD_ONS_DRIVERS_MIDI = emuxki ice1712 usb_midi ; SYSTEM_ADD_ONS_DRIVERS_NET = [ FFilterByBuildFeatures - x86 @{ + x86,x86_64 @{ 3com atheros813x ar81xx attansic_l1 attansic_l2 broadcom440x broadcom570x dec21xxx ipro100 ipro1000 jmicron2x0 marvell_yukon nforce pcnet rtl8139 rtl81xx sis19x syskonnect via_rhine vt612x - }@ # x86 + }@ # x86_64 etherpci pegasus sis900 usb_davicom usb_asix usb_ecm wb840 From a3fdd62c1365058249aea24fd3996eefcd1220e4 Mon Sep 17 00:00:00 2001 From: Gediminas Jarulaitis Date: Sun, 17 Mar 2013 16:44:07 +0200 Subject: [PATCH 132/136] iso9960, exfat, fat: Corrected time conversion mistakes. * Fixes #9524 * Some style cleanup Signed-off-by: Jerome Duval --- src/add-ons/kernel/file_systems/exfat/Inode.cpp | 6 ++++-- src/add-ons/kernel/file_systems/fat/util.c | 4 ++-- src/add-ons/kernel/file_systems/iso9660/iso9660.cpp | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/add-ons/kernel/file_systems/exfat/Inode.cpp b/src/add-ons/kernel/file_systems/exfat/Inode.cpp index 7081565640..c2548437de 100644 --- a/src/add-ons/kernel/file_systems/exfat/Inode.cpp +++ b/src/add-ons/kernel/file_systems/exfat/Inode.cpp @@ -270,9 +270,11 @@ Inode::_GetTimespec(uint16 date, uint16 time, struct timespec ×pec) const if (tzoffset == -1) tzoffset = get_timezone_offset() / 60; - time_t days = daze[(date>>5)&15] + ((date>>9)+10)*365 + leaps((date>>9)+10,((date>>5)&15)-1)+(date&31)-1; + time_t days = daze[(date >> 5) & 15] + ((date >> 9) + 10) * 365 + + leaps((date >> 9) + 10, ((date >> 5) & 15) - 1) + (date & 31) -1; - timespec.tv_sec = ((days * 24 + (time >> 11)) * 60 + ((time>>5)&63) + tzoffset) * 60 + 2*(time&31); + timespec.tv_sec = ((days * 24 + (time >> 11)) * 60 + ((time >> 5) & 63) + - tzoffset) * 60 + 2 * (time & 31); timespec.tv_nsec = 0; } diff --git a/src/add-ons/kernel/file_systems/fat/util.c b/src/add-ons/kernel/file_systems/fat/util.c index d5114f7731..7bab5e3a20 100644 --- a/src/add-ons/kernel/file_systems/fat/util.c +++ b/src/add-ons/kernel/file_systems/fat/util.c @@ -106,7 +106,7 @@ dos2time_t(uint32 t) days = daze[(t>>21)&15] + ((t>>25)+10)*365 + leaps((t>>25)+10,((t>>21)&15)-1)+((t>>16)&31)-1; - return (((days * 24) + ((t>>11)&31)) * 60 + ((t>>5)&63) + tzoffset) * 60 + 2*(t&31); + return (((days * 24) + ((t>>11)&31)) * 60 + ((t>>5)&63) - tzoffset) * 60 + 2*(t&31); } @@ -118,7 +118,7 @@ time_t2dos(time_t s) get_tzoffset(); - t = (s % 60) / 2; s /= 60; s -= tzoffset; + t = (s % 60) / 2; s /= 60; s += tzoffset; t += (s % 60) << 5; s /= 60; t += (s % 24) << 11;s /= 24; diff --git a/src/add-ons/kernel/file_systems/iso9660/iso9660.cpp b/src/add-ons/kernel/file_systems/iso9660/iso9660.cpp index c66ae29058..bbe2685e19 100644 --- a/src/add-ons/kernel/file_systems/iso9660/iso9660.cpp +++ b/src/add-ons/kernel/file_systems/iso9660/iso9660.cpp @@ -975,7 +975,7 @@ ConvertRecDate(ISORecDate* inDate, time_t* outDate) time_t time; int days, i, year, tz; - year = inDate->year -70; + year = inDate->year - 70; tz = inDate->offsetGMT; if (year < 0) { @@ -1002,7 +1002,7 @@ ConvertRecDate(ISORecDate* inDate, time_t* outDate) tz |= (-1 << 8); if (-48 <= tz && tz <= 52) - time += tz *15 * 60; + time -= tz * 15 * 60; } *outDate = time; return 0; From c3e68d8d92801ca71472daaa7e3c996d13d11ecf Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Sat, 11 May 2013 14:26:45 +0200 Subject: [PATCH 133/136] cdda, fat, iso9660: clear tv_nsecs fields in the stat struct * devfs in fact doesn't provide a zeroed buffer. --- .../kernel/file_systems/cdda/kernel_interface.cpp | 9 ++++++--- src/add-ons/kernel/file_systems/fat/file.c | 5 ++++- .../kernel/file_systems/iso9660/kernel_interface.cpp | 6 ++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp index 9ad819584a..fafd3a635d 100644 --- a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp @@ -528,9 +528,12 @@ fill_stat_buffer(Volume* volume, Inode* inode, Attribute* attribute, stat.st_uid = inode->UserID(); stat.st_gid = inode->GroupID(); - stat.st_atime = time(NULL); - stat.st_mtime = stat.st_ctime = inode->ModificationTime(); - stat.st_crtime = inode->CreationTime(); + stat.st_atim.tv_sec = time(NULL); + stat.st_atim.tv_nsec = 0; + stat.st_mtim.tv_sec = stat.st_ctim.tv_sec = inode->ModificationTime(); + stat.st_ctim.tv_nsec = stat.st_mtim.tv_nsec = 0; + stat.st_crtim.tv_sec = inode->CreationTime(); + stat.st_crtim.tv_nsec = 0; } diff --git a/src/add-ons/kernel/file_systems/fat/file.c b/src/add-ons/kernel/file_systems/fat/file.c index f06102115a..84a46e3cbc 100644 --- a/src/add-ons/kernel/file_systems/fat/file.c +++ b/src/add-ons/kernel/file_systems/fat/file.c @@ -180,7 +180,10 @@ dosfs_rstat(fs_volume *_vol, fs_vnode *_node, struct stat *st) st->st_size = node->st_size; st->st_blocks = (node->st_size + 511) / 512; st->st_blksize = 0x10000; /* this value was chosen arbitrarily */ - st->st_atime = st->st_mtime = st->st_ctime = st->st_crtime = node->st_time; + st->st_atim.tv_sec = st->st_mtim.tv_sec = st->st_ctim.tv_sec = + st->st_crtim.tv_sec = node->st_time; + st->st_atim.tv_nsec = st->st_mtim.tv_nsec = st->st_ctim.tv_nsec = + st->st_crtim.tv_nsec = 0; UNLOCK_VOL(vol); diff --git a/src/add-ons/kernel/file_systems/iso9660/kernel_interface.cpp b/src/add-ons/kernel/file_systems/iso9660/kernel_interface.cpp index 4ed83b5f90..fc3405cb43 100644 --- a/src/add-ons/kernel/file_systems/iso9660/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/iso9660/kernel_interface.cpp @@ -492,8 +492,10 @@ fs_read_stat(fs_volume* _volume, fs_vnode* _node, struct stat* st) // Same for file/dir in ISO9660 st->st_size = node->dataLen[FS_DATA_FORMAT]; st->st_blocks = (st->st_size + 511) / 512; - if (ConvertRecDate(&(node->recordDate), &time) == B_NO_ERROR) - st->st_ctime = st->st_mtime = st->st_atime = time; + if (ConvertRecDate(&(node->recordDate), &time) == B_NO_ERROR) { + st->st_ctim.tv_sec = st->st_mtim.tv_sec = st->st_atim.tv_sec = time; + st->st_ctim.tv_nsec = st->st_mtim.tv_nsec = st->st_atim.tv_nsec = 0; + } TRACE(("fs_read_stat - EXIT, result is %s\n", strerror(result))); From 4b723e3fb86ecc8027728c6c26d782964419f573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 6 May 2013 22:16:34 +0200 Subject: [PATCH 134/136] boot loader: Almost removed use of kernel_cpp.h. * For some reason that is beyond me, fat/CachedBlock.cpp needs this header, or else building the boot loader fails. --- src/system/boot/loader/RootFileSystem.cpp | 21 +++++++------ .../file_systems/amiga_ffs/Directory.cpp | 19 ++++++------ .../loader/file_systems/amiga_ffs/File.cpp | 10 +++---- .../loader/file_systems/amiga_ffs/Volume.cpp | 9 +++--- .../file_systems/amiga_ffs/amiga_ffs.cpp | 29 +++++++++--------- .../loader/file_systems/bfs/Directory.cpp | 17 +++++------ .../boot/loader/file_systems/bfs/File.cpp | 16 +++++----- .../boot/loader/file_systems/bfs/Link.cpp | 10 +++---- .../boot/loader/file_systems/bfs/Stream.cpp | 4 +-- .../boot/loader/file_systems/bfs/bfs.cpp | 3 +- .../loader/file_systems/fat/CachedBlock.h | 6 +--- .../loader/file_systems/fat/Directory.cpp | 12 ++++---- .../boot/loader/file_systems/fat/File.cpp | 10 +++---- .../boot/loader/file_systems/fat/Stream.cpp | 2 +- .../boot/loader/file_systems/fat/Volume.cpp | 30 ++++++++++--------- .../boot/loader/file_systems/fat/fatfs.cpp | 7 ++--- .../loader/file_systems/hfs_plus/hfs_plus.cpp | 3 +- .../boot/loader/file_systems/tarfs/tarfs.cpp | 5 ++-- src/system/boot/loader/heap.cpp | 3 +- src/system/boot/loader/main.cpp | 4 +-- src/system/boot/loader/menu.cpp | 3 +- src/system/boot/loader/partitions.cpp | 7 ++--- src/system/boot/loader/stdio.cpp | 3 +- src/system/boot/loader/vfs.cpp | 3 +- 24 files changed, 110 insertions(+), 126 deletions(-) diff --git a/src/system/boot/loader/RootFileSystem.cpp b/src/system/boot/loader/RootFileSystem.cpp index 441f5a1765..2c654d8641 100644 --- a/src/system/boot/loader/RootFileSystem.cpp +++ b/src/system/boot/loader/RootFileSystem.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -7,7 +7,6 @@ #include "RootFileSystem.h" #include -#include #include #include @@ -29,7 +28,7 @@ RootFileSystem::~RootFileSystem() } -status_t +status_t RootFileSystem::Open(void **_cookie, int mode) { EntryIterator *iterator = new (std::nothrow) EntryIterator(&fList); @@ -42,7 +41,7 @@ RootFileSystem::Open(void **_cookie, int mode) } -status_t +status_t RootFileSystem::Close(void *cookie) { delete (EntryIterator *)cookie; @@ -84,7 +83,7 @@ RootFileSystem::Lookup(const char *name, bool /*traverseLinks*/) } -status_t +status_t RootFileSystem::GetNextEntry(void *_cookie, char *name, size_t size) { EntryIterator *iterator = (EntryIterator *)_cookie; @@ -98,7 +97,7 @@ RootFileSystem::GetNextEntry(void *_cookie, char *name, size_t size) } -status_t +status_t RootFileSystem::GetNextNode(void *_cookie, Node **_node) { EntryIterator *iterator = (EntryIterator *)_cookie; @@ -113,24 +112,24 @@ RootFileSystem::GetNextNode(void *_cookie, Node **_node) } -status_t +status_t RootFileSystem::Rewind(void *_cookie) { EntryIterator *iterator = (EntryIterator *)_cookie; iterator->Rewind(); - return B_OK; + return B_OK; } -bool +bool RootFileSystem::IsEmpty() { return fList.IsEmpty(); } -status_t +status_t RootFileSystem::AddVolume(Directory *volume, Partition *partition) { struct entry *entry = new (std::nothrow) RootFileSystem::entry(); @@ -165,7 +164,7 @@ RootFileSystem::AddLink(const char *name, Directory *target) } -status_t +status_t RootFileSystem::GetPartitionFor(Directory *volume, Partition **_partition) { EntryIterator iterator = fList.GetIterator(); diff --git a/src/system/boot/loader/file_systems/amiga_ffs/Directory.cpp b/src/system/boot/loader/file_systems/amiga_ffs/Directory.cpp index c299717118..17e893576e 100644 --- a/src/system/boot/loader/file_systems/amiga_ffs/Directory.cpp +++ b/src/system/boot/loader/file_systems/amiga_ffs/Directory.cpp @@ -1,7 +1,7 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + */ #include "Directory.h" @@ -9,7 +9,6 @@ #include "File.h" #include -#include #include #include @@ -18,6 +17,7 @@ namespace FFS { + Directory::Directory(Volume &volume, int32 block) : fVolume(volume) @@ -45,14 +45,14 @@ Directory::~Directory() } -status_t +status_t Directory::InitCheck() { return fNode.ValidateCheckSum(); } -status_t +status_t Directory::Open(void **_cookie, int mode) { _inherited::Open(_cookie, mode); @@ -71,7 +71,7 @@ Directory::Open(void **_cookie, int mode) } -status_t +status_t Directory::Close(void *cookie) { _inherited::Close(cookie); @@ -113,7 +113,7 @@ Directory::Lookup(const char *name, bool traverseLinks) } -status_t +status_t Directory::GetNextEntry(void *cookie, char *name, size_t size) { HashIterator *iterator = (HashIterator *)cookie; @@ -127,7 +127,7 @@ Directory::GetNextEntry(void *cookie, char *name, size_t size) } -status_t +status_t Directory::GetNextNode(void *cookie, Node **_node) { return B_ERROR; @@ -165,4 +165,5 @@ Directory::Inode() const return fNode.HeaderKey(); } + } // namespace FFS diff --git a/src/system/boot/loader/file_systems/amiga_ffs/File.cpp b/src/system/boot/loader/file_systems/amiga_ffs/File.cpp index 249d17bf9e..f75be4f8ff 100644 --- a/src/system/boot/loader/file_systems/amiga_ffs/File.cpp +++ b/src/system/boot/loader/file_systems/amiga_ffs/File.cpp @@ -1,7 +1,7 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + */ #include "File.h" @@ -10,11 +10,10 @@ #include #include -#include - namespace FFS { + class Stream { public: Stream(int device, FileBlock &node); @@ -255,4 +254,5 @@ File::Inode() const return fNode.HeaderKey(); } + } // namespace FFS diff --git a/src/system/boot/loader/file_systems/amiga_ffs/Volume.cpp b/src/system/boot/loader/file_systems/amiga_ffs/Volume.cpp index 4d1cd26e31..295ff39f9d 100644 --- a/src/system/boot/loader/file_systems/amiga_ffs/Volume.cpp +++ b/src/system/boot/loader/file_systems/amiga_ffs/Volume.cpp @@ -1,7 +1,7 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + */ #include "Volume.h" @@ -9,7 +9,6 @@ #include #include -#include #include #include @@ -87,7 +86,7 @@ Volume::~Volume() } -status_t +status_t Volume::InitCheck() { if (fRoot != NULL) diff --git a/src/system/boot/loader/file_systems/amiga_ffs/amiga_ffs.cpp b/src/system/boot/loader/file_systems/amiga_ffs/amiga_ffs.cpp index 07fe89981d..28cc48f82e 100644 --- a/src/system/boot/loader/file_systems/amiga_ffs/amiga_ffs.cpp +++ b/src/system/boot/loader/file_systems/amiga_ffs/amiga_ffs.cpp @@ -1,14 +1,13 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. + * Distributed under the terms of the MIT License. + */ #include "amiga_ffs.h" #include #include -#include #include #include @@ -31,7 +30,7 @@ class BCPLString { }; -int32 +int32 BCPLString::CopyTo(char *name, size_t size) { int32 length = size - 1 > Length() ? Length() : size - 1; @@ -56,7 +55,7 @@ BaseBlock::GetNameBackOffset(int32 offset, char *name, size_t size) const } -status_t +status_t BaseBlock::ValidateCheckSum() const { if (fData == NULL) @@ -74,7 +73,7 @@ BaseBlock::ValidateCheckSum() const // #pragma mark - -char +char DirectoryBlock::ToUpperChar(int32 type, char c) const { // Taken from Ralph Babel's "The Amiga Guru Book" (1993), section 15.3.4.3 @@ -87,11 +86,11 @@ DirectoryBlock::ToUpperChar(int32 type, char c) const } -int32 +int32 DirectoryBlock::HashIndexFor(int32 type, const char *name) const { int32 hash = strlen(name); - + while (name[0]) { hash = (hash * 13 + ToUpperChar(type, name[0])) & 0x7ff; name++; @@ -101,7 +100,7 @@ DirectoryBlock::HashIndexFor(int32 type, const char *name) const } -int32 +int32 DirectoryBlock::HashValueAt(int32 index) const { return index >= HashSize() ? -1 : (int32)B_BENDIAN_TO_HOST_INT32(HashTable()[index]); @@ -116,11 +115,11 @@ DirectoryBlock::FirstHashValue(int32 &index) const } -int32 +int32 DirectoryBlock::NextHashValue(int32 &index) const { index++; - + int32 value; while ((value = HashValueAt(index)) == 0) { if (++index >= HashSize()) @@ -152,14 +151,14 @@ HashIterator::~HashIterator() } -status_t +status_t HashIterator::InitCheck() { return fData != NULL ? B_OK : B_NO_MEMORY; } -void +void HashIterator::Goto(int32 index) { fCurrent = index; @@ -197,7 +196,7 @@ HashIterator::GetNext(int32 &block) } -void +void HashIterator::Rewind() { fCurrent = 0; diff --git a/src/system/boot/loader/file_systems/bfs/Directory.cpp b/src/system/boot/loader/file_systems/bfs/Directory.cpp index 91fe02ffab..a4f5642880 100644 --- a/src/system/boot/loader/file_systems/bfs/Directory.cpp +++ b/src/system/boot/loader/file_systems/bfs/Directory.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -10,7 +10,6 @@ #include #include -#include #include #include @@ -52,14 +51,14 @@ Directory::~Directory() } -status_t +status_t Directory::InitCheck() { return fStream.InitCheck(); } -status_t +status_t Directory::Open(void **_cookie, int mode) { _inherited::Open(_cookie, mode); @@ -72,7 +71,7 @@ Directory::Open(void **_cookie, int mode) } -status_t +status_t Directory::Close(void *cookie) { _inherited::Close(cookie); @@ -118,7 +117,7 @@ Directory::Lookup(const char *name, bool traverseLinks) } -status_t +status_t Directory::GetNextEntry(void *cookie, char *name, size_t size) { TreeIterator *iterator = (TreeIterator *)cookie; @@ -129,7 +128,7 @@ Directory::GetNextEntry(void *cookie, char *name, size_t size) } -status_t +status_t Directory::GetNextNode(void *cookie, Node **_node) { TreeIterator *iterator = (TreeIterator *)cookie; @@ -149,7 +148,7 @@ Directory::GetNextNode(void *cookie, Node **_node) } -status_t +status_t Directory::Rewind(void *cookie) { TreeIterator *iterator = (TreeIterator *)cookie; @@ -158,7 +157,7 @@ Directory::Rewind(void *cookie) } -bool +bool Directory::IsEmpty() { TreeIterator iterator(&fTree); diff --git a/src/system/boot/loader/file_systems/bfs/File.cpp b/src/system/boot/loader/file_systems/bfs/File.cpp index 626731d39f..2853ed11b1 100644 --- a/src/system/boot/loader/file_systems/bfs/File.cpp +++ b/src/system/boot/loader/file_systems/bfs/File.cpp @@ -1,16 +1,15 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. + * This file may be used under the terms of the MIT License. + */ #include "File.h" -#include - namespace BFS { + File::File(Volume &volume, block_run run) : fStream(volume, run) @@ -37,14 +36,14 @@ File::~File() } -status_t +status_t File::InitCheck() { return fStream.InitCheck(); } -ssize_t +ssize_t File::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize) { status_t status = fStream.ReadAt(pos, (uint8 *)buffer, &bufferSize); @@ -55,7 +54,7 @@ File::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize) } -ssize_t +ssize_t File::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize) { return EROFS; @@ -89,4 +88,5 @@ File::Inode() const return fStream.ID(); } + } // namespace BFS diff --git a/src/system/boot/loader/file_systems/bfs/Link.cpp b/src/system/boot/loader/file_systems/bfs/Link.cpp index 381abb9515..c5159a2003 100644 --- a/src/system/boot/loader/file_systems/bfs/Link.cpp +++ b/src/system/boot/loader/file_systems/bfs/Link.cpp @@ -1,16 +1,15 @@ /* -** Copyright 2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2004-2013, Axel Dörfler, axeld@pinc-software.de. + * This file may be used under the terms of the MIT License. + */ #include "Link.h" -#include - namespace BFS { + Link::Link(Volume &volume, block_run run) : File(volume, run) { @@ -63,4 +62,5 @@ Link::Type() const return S_IFLNK; } + } // namespace BFS diff --git a/src/system/boot/loader/file_systems/bfs/Stream.cpp b/src/system/boot/loader/file_systems/bfs/Stream.cpp index 9eb25b7e30..4cdea7dd85 100644 --- a/src/system/boot/loader/file_systems/bfs/Stream.cpp +++ b/src/system/boot/loader/file_systems/bfs/Stream.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * This file may be used under the terms of the MIT License. */ @@ -12,8 +12,6 @@ #include "File.h" #include "Link.h" -#include - #include #include #include diff --git a/src/system/boot/loader/file_systems/bfs/bfs.cpp b/src/system/boot/loader/file_systems/bfs/bfs.cpp index f6cfd3b36a..3fee5a9dc4 100644 --- a/src/system/boot/loader/file_systems/bfs/bfs.cpp +++ b/src/system/boot/loader/file_systems/bfs/bfs.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -12,7 +12,6 @@ #include #include #include -#include #include "Volume.h" #include "Directory.h" diff --git a/src/system/boot/loader/file_systems/fat/CachedBlock.h b/src/system/boot/loader/file_systems/fat/CachedBlock.h index f19ca82036..ab6f6f5342 100644 --- a/src/system/boot/loader/file_systems/fat/CachedBlock.h +++ b/src/system/boot/loader/file_systems/fat/CachedBlock.h @@ -9,16 +9,12 @@ #define CACHED_BLOCK_H -#include -#include -#include -#include - #include "Volume.h" namespace FATFS { + class CachedBlock { public: enum { diff --git a/src/system/boot/loader/file_systems/fat/Directory.cpp b/src/system/boot/loader/file_systems/fat/Directory.cpp index f1e56e6f5a..caa010aa5d 100644 --- a/src/system/boot/loader/file_systems/fat/Directory.cpp +++ b/src/system/boot/loader/file_systems/fat/Directory.cpp @@ -1,7 +1,8 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2008, François Revol + * Distributed under the terms of the MIT License. + */ #include "Directory.h" @@ -14,7 +15,6 @@ #include #include -#include #include "CachedBlock.h" #include "File.h" @@ -24,8 +24,10 @@ //#define TRACE(x) dprintf x #define TRACE(x) do {} while (0) + namespace FATFS { + struct dir_entry { void *Buffer() const { return (void *)fName; }; const char *BaseName() const { return fName; }; @@ -328,7 +330,7 @@ Directory::Open(void **_cookie, int mode) TRACE(("FASFS::Directory::%s(, %d)\n", __FUNCTION__, mode)); _inherited::Open(_cookie, mode); - struct dir_cookie *c = new struct dir_cookie; + dir_cookie *c = new(nothrow) dir_cookie; if (c == NULL) return B_NO_MEMORY; diff --git a/src/system/boot/loader/file_systems/fat/File.cpp b/src/system/boot/loader/file_systems/fat/File.cpp index 4a06da1934..60ac2e8fb5 100644 --- a/src/system/boot/loader/file_systems/fat/File.cpp +++ b/src/system/boot/loader/file_systems/fat/File.cpp @@ -1,7 +1,8 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2008, François Revol + * Distributed under the terms of the MIT License. + */ #include "File.h" @@ -9,8 +10,6 @@ #include #include -#include - #include "Directory.h" @@ -137,4 +136,5 @@ File::Inode() const return fStream.FirstCluster() << 16; } + } // namespace FATFS diff --git a/src/system/boot/loader/file_systems/fat/Stream.cpp b/src/system/boot/loader/file_systems/fat/Stream.cpp index a8d8754e11..3ed255f656 100644 --- a/src/system/boot/loader/file_systems/fat/Stream.cpp +++ b/src/system/boot/loader/file_systems/fat/Stream.cpp @@ -17,12 +17,12 @@ #include #include -#include #include "CachedBlock.h" #include "Directory.h" #include "File.h" + //#define TRACE(x) dprintf x #define TRACE(x) do {} while (0) diff --git a/src/system/boot/loader/file_systems/fat/Volume.cpp b/src/system/boot/loader/file_systems/fat/Volume.cpp index fae51c9ca9..c2da9568a6 100644 --- a/src/system/boot/loader/file_systems/fat/Volume.cpp +++ b/src/system/boot/loader/file_systems/fat/Volume.cpp @@ -1,7 +1,8 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2008, François Revol + * Distributed under the terms of the MIT License. + */ #include "Volume.h" @@ -10,7 +11,6 @@ #include #include -#include #include #include @@ -18,9 +18,11 @@ #include #include + //#define TRACE(x) dprintf x #define TRACE(x) do {} while (0) + using namespace FATFS; @@ -33,7 +35,7 @@ Volume::Volume(boot::Partition *partition) if ((fDevice = open_node(partition, O_RDONLY)) < B_OK) return; - fCachedBlock = new CachedBlock(*this); + fCachedBlock = new(nothrow) CachedBlock(*this); if (fCachedBlock == NULL) return; @@ -135,13 +137,13 @@ Volume::Volume(boot::Partition *partition) fFatBits = 16; goto err1; } - TRACE(("%s: block size %d, sector size %d, sectors/cluster %d\n", __FUNCTION__, - fBlockSize, fBytesPerSector, fSectorsPerCluster)); - TRACE(("%s: block shift %d, sector shift %d, cluster shift %d\n", __FUNCTION__, - fBlockShift, fSectorShift, fClusterShift)); - TRACE(("%s: reserved %d, max root entries %d, media %02x, sectors/fat %d\n", __FUNCTION__, - fReservedSectors, fMaxRootEntries, fMediaDesc, fSectorsPerFat)); - + TRACE(("%s: block size %d, sector size %d, sectors/cluster %d\n", + __FUNCTION__, fBlockSize, fBytesPerSector, fSectorsPerCluster)); + TRACE(("%s: block shift %d, sector shift %d, cluster shift %d\n", + __FUNCTION__, fBlockShift, fSectorShift, fClusterShift)); + TRACE(("%s: reserved %d, max root entries %d, media %02x, sectors/fat %d\n", + __FUNCTION__, fReservedSectors, fMaxRootEntries, fMediaDesc, + fSectorsPerFat)); //if (fTotalSectors > partition->sectors_per_track * partition->cylinder_count * partition->head_count) if ((off_t)fTotalSectors * fBytesPerSector > partition->size) @@ -150,7 +152,7 @@ Volume::Volume(boot::Partition *partition) TRACE(("%s: found fat%d filesystem, root dir at cluster %d\n", __FUNCTION__, fFatBits, fRootDirCluster)); - fRoot = new Directory(*this, 0, fRootDirCluster, "/"); + fRoot = new(nothrow) Directory(*this, 0, fRootDirCluster, "/"); return; err1: @@ -413,7 +415,7 @@ static status_t dosfs_get_file_system(boot::Partition *partition, ::Directory **_root) { TRACE(("%s()\n", __FUNCTION__)); - Volume *volume = new Volume(partition); + Volume *volume = new(nothrow) Volume(partition); if (volume == NULL) return B_NO_MEMORY; diff --git a/src/system/boot/loader/file_systems/fat/fatfs.cpp b/src/system/boot/loader/file_systems/fat/fatfs.cpp index 074476f3e1..2a989109f8 100644 --- a/src/system/boot/loader/file_systems/fat/fatfs.cpp +++ b/src/system/boot/loader/file_systems/fat/fatfs.cpp @@ -1,14 +1,13 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2008, François Revol + * Distributed under the terms of the MIT License. + */ #include "fatfs.h" #include #include -#include #include #include diff --git a/src/system/boot/loader/file_systems/hfs_plus/hfs_plus.cpp b/src/system/boot/loader/file_systems/hfs_plus/hfs_plus.cpp index c44cc1a227..ea3d0c26d0 100644 --- a/src/system/boot/loader/file_systems/hfs_plus/hfs_plus.cpp +++ b/src/system/boot/loader/file_systems/hfs_plus/hfs_plus.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2005-2013, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -8,7 +8,6 @@ #include #include -#include #include #include diff --git a/src/system/boot/loader/file_systems/tarfs/tarfs.cpp b/src/system/boot/loader/file_systems/tarfs/tarfs.cpp index 6b75f2733c..60960fc8af 100644 --- a/src/system/boot/loader/file_systems/tarfs/tarfs.cpp +++ b/src/system/boot/loader/file_systems/tarfs/tarfs.cpp @@ -1,6 +1,6 @@ /* * Copyright 2005-2007, Ingo Weinhold, bonefish@cs.tu-berlin.de. - * Copyright 2005-2009, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2005-2013, Axel Dörfler, axeld@pinc-software.de. * * Distributed under the terms of the MIT License. */ @@ -21,7 +21,6 @@ #include #include -#include #include @@ -39,6 +38,7 @@ static const size_t kTarRegionSize = 8 * 1024 * 1024; // 8 MB namespace TarFS { + struct RegionDelete { inline void operator()(void* memory) { @@ -813,7 +813,6 @@ TarFS::Volume::_Inflate(boot::Partition* partition, void* cookie, off_t offset, } - // #pragma mark - diff --git a/src/system/boot/loader/heap.cpp b/src/system/boot/loader/heap.cpp index 970ce7f272..574548dda5 100644 --- a/src/system/boot/loader/heap.cpp +++ b/src/system/boot/loader/heap.cpp @@ -1,12 +1,11 @@ /* - * Copyright 2003-2009, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ #include #include -#include #ifdef HEAP_TEST # include diff --git a/src/system/boot/loader/main.cpp b/src/system/boot/loader/main.cpp index 63a78a1e9a..efa659a351 100644 --- a/src/system/boot/loader/main.cpp +++ b/src/system/boot/loader/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -14,8 +14,6 @@ #include #include -#include - //#define TRACE_MAIN #ifdef TRACE_MAIN diff --git a/src/system/boot/loader/menu.cpp b/src/system/boot/loader/menu.cpp index fbb90d5427..4e4da2cd4f 100644 --- a/src/system/boot/loader/menu.cpp +++ b/src/system/boot/loader/menu.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * Copyright 2011, Rene Gollent, rene@gollent.com. * Distributed under the terms of the MIT License. */ @@ -21,7 +21,6 @@ #include #include #include -#include #include #include "kernel_debug_config.h" diff --git a/src/system/boot/loader/partitions.cpp b/src/system/boot/loader/partitions.cpp index 29d4f20f76..f70bc8a407 100644 --- a/src/system/boot/loader/partitions.cpp +++ b/src/system/boot/loader/partitions.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -16,7 +16,6 @@ #include #include #include -#include #include "RootFileSystem.h" @@ -212,7 +211,7 @@ Partition::Type() const Partition * Partition::AddChild() { - Partition *child = new Partition(fFD); + Partition *child = new(nothrow) Partition(fFD); TRACE(("%p Partition::AddChild %p\n", this, child)); if (child == NULL) return NULL; @@ -426,7 +425,7 @@ add_partitions_for(int fd, bool mountFileSystems, bool isBootDevice) TRACE(("add_partitions_for(fd = %d, mountFS = %s)\n", fd, mountFileSystems ? "yes" : "no")); - Partition *partition = new Partition(fd); + Partition *partition = new(nothrow) Partition(fd); // set some magic/default values partition->block_size = 512; diff --git a/src/system/boot/loader/stdio.cpp b/src/system/boot/loader/stdio.cpp index ca430ea730..267ddbd46f 100644 --- a/src/system/boot/loader/stdio.cpp +++ b/src/system/boot/loader/stdio.cpp @@ -1,12 +1,11 @@ /* - * Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ #include #include -#include #include #include diff --git a/src/system/boot/loader/vfs.cpp b/src/system/boot/loader/vfs.cpp index 9c1d5e1e1f..8e6b6c0867 100644 --- a/src/system/boot/loader/vfs.cpp +++ b/src/system/boot/loader/vfs.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2003-2013, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -18,7 +18,6 @@ #include #include #include -#include #include #include "RootFileSystem.h" From c4f684f80fc465e81c0b9734127835320373dc2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 11 May 2013 22:20:57 +0200 Subject: [PATCH 135/136] Style fix as suggested by Axel :) --- src/add-ons/kernel/drivers/audio/emuxki/emuxki.c | 10 +++++----- .../kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp | 4 ++-- src/add-ons/kernel/file_systems/fat/file.c | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/add-ons/kernel/drivers/audio/emuxki/emuxki.c b/src/add-ons/kernel/drivers/audio/emuxki/emuxki.c index c69a304382..713554615d 100644 --- a/src/add-ons/kernel/drivers/audio/emuxki/emuxki.c +++ b/src/add-ons/kernel/drivers/audio/emuxki/emuxki.c @@ -353,12 +353,12 @@ emuxki_mem_free(emuxki_dev *card, void *ptr) static void emuxki_chanparms_set_defaults(emuxki_channel *chan) { - chan->fxsend.a.level = chan->fxsend.b.level = - chan->fxsend.c.level = chan->fxsend.d.level = + chan->fxsend.a.level = chan->fxsend.b.level + = chan->fxsend.c.level = chan->fxsend.d.level /* for audigy */ - chan->fxsend.e.level = chan->fxsend.f.level = - chan->fxsend.g.level = chan->fxsend.h.level = - IS_AUDIGY(&chan->voice->stream->card->config) ? 0xc0 : 0xff; /* not max */ + = chan->fxsend.e.level = chan->fxsend.f.level + = chan->fxsend.g.level = chan->fxsend.h.level + = IS_AUDIGY(&chan->voice->stream->card->config) ? 0xc0 : 0xff; /* not max */ chan->fxsend.a.dest = 0x0; chan->fxsend.b.dest = 0x1; diff --git a/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp b/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp index 8621489b44..b24a77ce04 100644 --- a/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp +++ b/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp @@ -669,8 +669,8 @@ usb_disk_device_added(usb_device newDevice, void **cookie) mutex_init(&device->lock, "usb_disk device lock"); - status_t result = device->notify = - create_sem(0, "usb_disk callback notify"); + status_t result = device->notify + = create_sem(0, "usb_disk callback notify"); if (result < B_OK) { mutex_destroy(&device->lock); diff --git a/src/add-ons/kernel/file_systems/fat/file.c b/src/add-ons/kernel/file_systems/fat/file.c index 84a46e3cbc..d9239a3b59 100644 --- a/src/add-ons/kernel/file_systems/fat/file.c +++ b/src/add-ons/kernel/file_systems/fat/file.c @@ -180,10 +180,10 @@ dosfs_rstat(fs_volume *_vol, fs_vnode *_node, struct stat *st) st->st_size = node->st_size; st->st_blocks = (node->st_size + 511) / 512; st->st_blksize = 0x10000; /* this value was chosen arbitrarily */ - st->st_atim.tv_sec = st->st_mtim.tv_sec = st->st_ctim.tv_sec = - st->st_crtim.tv_sec = node->st_time; - st->st_atim.tv_nsec = st->st_mtim.tv_nsec = st->st_ctim.tv_nsec = - st->st_crtim.tv_nsec = 0; + st->st_atim.tv_sec = st->st_mtim.tv_sec = st->st_ctim.tv_sec + = st->st_crtim.tv_sec = node->st_time; + st->st_atim.tv_nsec = st->st_mtim.tv_nsec = st->st_ctim.tv_nsec + = st->st_crtim.tv_nsec = 0; UNLOCK_VOL(vol); From 88cc420211bede33bbcc8dfedd9ca09bc7678a24 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 11 May 2013 16:45:04 -0400 Subject: [PATCH 136/136] Improve basic profiler output a little. If on gcc4, use the built-in demangling functions to present demangled names in the output where possible. --- src/bin/debug/profile/BasicProfileResult.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/bin/debug/profile/BasicProfileResult.cpp b/src/bin/debug/profile/BasicProfileResult.cpp index 15e8fa3f85..52f707fbd2 100644 --- a/src/bin/debug/profile/BasicProfileResult.cpp +++ b/src/bin/debug/profile/BasicProfileResult.cpp @@ -6,6 +6,9 @@ #include "BasicProfileResult.h" +#if __GNUC__ > 2 +#include +#endif #include #include @@ -210,10 +213,23 @@ BasicProfileResult::PrintResults(ImageProfileResultContainer* container) for (int32 i = 0; i < hitSymbolCount; i++) { const HitSymbol& hitSymbol = hitSymbols[i]; const Symbol* symbol = hitSymbol.symbol; +#if __GNUC__ > 2 + int status; + const char* symbolName = __cxxabiv1::__cxa_demangle(symbol->Name(), + NULL, NULL, &status); + if (symbolName == NULL) + symbolName = symbol->Name(); +#else + const char* symbolName = symbol->Name(); +#endif fprintf(gOptions.output, " %10lld %10lld %6.2f %6ld %s\n", hitSymbol.hits, hitSymbol.hits * fInterval, 100.0 * hitSymbol.hits / totalTicks, hitSymbol.imageID, - symbol->Name()); + symbolName); +#if __GNUC__ > 2 + if (status == 0) + free(const_cast(symbolName)); +#endif } } else fprintf(gOptions.output, " no functions were hit\n");